如何使用GDB分析通向系统库的堆栈跟踪?

时间:2012-09-03 12:17:46

标签: gdb segmentation-fault stack-trace


我试图找到在系统库级别上发生的段错误的原因。 我想获得一些关于如何使用gdb来检查以下堆栈跟踪中看到的getenv()调用的args的提示。

跟踪显示 - 我的代码不直接调用getenv() - 调用嵌套在我的代码中启动的系统调用链中。调用从我的例程a_logmsg()开始尝试获取线程安全localtime - localtime_r(),稍后在libc代码中的某处调用getenv()。操作系统是Solaris 8 / SPARC。

Program terminated with signal 11, Segmentation fault.
#0  0xfed3c9a0 in getenv () from /usr/lib/libc.so.1
(gdb) where
#0  0xfed3c9a0 in getenv () from /usr/lib/libc.so.1
#1  0xfed46ab0 in getsystemTZ () from /usr/lib/libc.so.1
#2  0xfed44918 in ltzset_u () from /usr/lib/libc.so.1
#3  0xfed44140 in localtime_r () from /usr/lib/libc.so.1
#4  0x00029c28 in a_logmsg (fmt=0xfd5d0 "%s: no changes to config.") at misc.c:155
#5  0x000273b8 in a_sync_device (device_group=0x11e3ed0 "none", hostname=0xfbbffe8d "router",
    config_by=0xfbbffc8f "scheduled_archiving", platform=0x11e3ee0 "cisco", authset=0x11e3ef0 "set01",
    arch_method=0xffffcfc8 <Address 0xffffcfc8 out of bounds>) at arch.c:256
#6  0x00027ce8 in a_archive_single (arg=0x1606f50) at arch.c:498
#7  0xfe775378 in _lwp_start () from /usr/lib/libthread.so.1
#8  0xfe775378 in _lwp_start () from /usr/lib/libthread.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

1 个答案:

答案 0 :(得分:1)

  

我想获得一些关于如何使用gdb来检查在下面的堆栈跟踪中看到的getenv()调用的args的提示。

  1. Solaris libc的源代码可用here
  2. 您可以通过设置断点来查看getenv的参数,并查看寄存器。您需要知道所使用的ABI,但这很简单 - getenv的参数位于寄存器i0中,而print (char*)$i0位于{{1}提示应打印(gdb)
  3. 最后,"TZ"崩溃的最可能原因是您之前已经破坏了环境。请特别注意,此代码错误

    getenv

    您通常可以通过以下命令之一检查环境:

    void buggy()
    {
       char buf[80];
       strcpy(buf, "FOO=BAR");
       putenv(buf);  // <-- BUG!
    }
    

    有可能,你会在那里看到不包含(gdb) x/100s __environ (gdb) x/100s environ 标志的字符串。