我正在尝试检查在我的服务器上“挂起”的进程。我正在使用 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/