【问题标题】:GDB attatching to PID - Cannot Access Memory AddressGDB 附加到 PID - 无法访问内存地址
【发布时间】:2016-03-04 19:09:52
【问题描述】:

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

Cannot Access Memory Address 是导致此进程挂起的潜在原因吗?还是说软件已经退出,但还有一个正在运行的进程?

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

【问题讨论】:

  • 听起来您正在附加到应用程序的生产版本。那些可能启用了优化并剥离了调试符号。因此,您不能完全依赖 gdb 告诉您的内容。例如,启用优化后,某些变量值将在任何给定时间对 gdb 不可用。所以我的建议是将上述信息保留为数据点。但不要仅凭这些就下定论。不幸的是,您需要进一步调试。

标签: linux debugging gdb casperjs


【解决方案1】:

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

没有。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多