2016-03-04 103 views
0

我正在尝试检查在我的服务器上“挂起”的进程。我使用gdb进行attatch的过程中,像这样:GDB映射到PID - 无法访问内存地址

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 ??() 

是对Cannot Access Memory Address会出现这种进程挂起一个潜在的原因是什么?或者是否意味着软件已经退出,但仍然有一个正在运行的进程?

这是一个CasperJS脚本btw。

+0

听起来就像您附加到应用程序的生产版本。这些可能会启用优化并删除调试符号。所以你不能完全依靠gdb告诉你的。例如,启用优化功能后,某些变量值在任何给定时间都不可用于gdb。所以我的建议是将上面的信息保存为数据点。但是不要仅仅依靠那些人得出确切的结论。不幸的是,你需要进一步调试。 – kaylum

回答

0

无法访问内存地址是导致此过程挂起的潜在原因吗?

这可能是因为你的整个堆栈是假的,你的过程是不是里面__getpwuid_r可言号。

发生这种情况的一种方法是更新系统库,但尚未重新启动该过程。然后,GDB将查看当前安装的系统库,这些库与过程实际使用的副本不匹配。

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

如果确实如此,那么您必须安排GDB在获取正确的堆栈跟踪之前查看系统库的旧版本(在启动过程时最新的版本)。 This answer可能有助于设置。

相关问题