linux - 附加到 PID 的 GDB - 无法访问内存地址

标签 linux debugging gdb casperjs

我正在尝试检查在我的服务器上“挂起”的进程。我正在使用 gdb 像这样附加到进程:

gdb -p PID

在 gdb 中,我运行 bt 并得到以下信息:

(gdb) bt
#0  0x00007f57f4be73ba in __getpwuid_r (uid=4113672712, resbuf=0x7f57f531ce40, buffer=0x1 <error: Cannot access memory at address 0x1>, buflen=0, 
    result=0x7f57f531a048) at ../nss/getXXbyYY_r.c:198
#1  0x00007f5700000004 in ?? ()
#2  0x0000000000000060 in ?? ()
#3  0x0000000000000001 in ?? ()
#4  0x00007f5700000031 in ?? ()
#5  0x0000000000000000 in ?? ()

无法访问内存地址 是否是导致此进程挂起的潜在原因?还是说软件已经退出但还有运行进程?

顺便说一句,这是一个 CasperJS 脚本。

最佳答案

Is the Cannot Access Memory Address a potential reason for causing this process to hang?

没有。

很可能您的整个堆栈都是伪造的,并且您的进程根本不在 __getpwuid_r 中。

发生这种情况的一种方式是,如果您更新了系统库,但没有重新启动进程。 GDB 然后查看当前安装的系统库,这些库与进程实际使用的副本不匹配。

您可以通过在 /proc/$PID/maps 中查找“(已删除)”条目来证明这一点。

如果确实是这种情况,您必须安排 GDB 查看旧版本的系统库(进程启动时的最新版本),然后才能获得正确的堆栈跟踪。 This answer可能有助于设置。

关于linux - 附加到 PID 的 GDB - 无法访问内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35804174/

相关文章:

c - 在断点后中断几行

c++ - 为什么 "Start Debugging"在VC2010中比 "attach to process"慢这么多?

c++ - 为什么我得到这个调试断言失败?表达式 : list iterator not dereferenceable

linux - 如何在 Linux 上获取 gdb 以查找在 Windows 上编译的二进制交叉编译的源文件

linux - 如何统计从特定主机收到的数据包数量?

debugging - 你觉得源代码分析器有用吗?

python - gdb python : How to do arithmetic operation on a gdb. 值?

python - cygdb导入错误: No module named 'Cython'

linux - 无法升级 cabal 本身

linux - 如何根据第一个脚本的结果从另一个 shell 脚本调用 shell 脚本?