3


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

正如跟踪所示 -getenv()我的代码不直接调用 - 调用嵌套在我的代码中启动的系统调用链中。调用从我的例程开始,a_logmsg()试图获得线程安全localtime - localtime_r(),然后getenv()在 libc 的代码中的某个地方调用。操作系统是 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?)
4

1 回答 1

1

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

  1. Solaris libc 的源代码可在此处获得。
  2. 您可以getenv通过在其上设置断点并查看寄存器来检查参数。您需要知道所使用的ABI,但这很简单—— 的参数getenv在 registeri0中,并且print (char*)$i0(gdb)提示符处应该 print "TZ"

最后,崩溃的最可能原因getenv是您之前破坏了环境。特别要注意,这段代码很糟糕

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

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

(gdb) x/100s __environ
(gdb) x/100s environ

很有可能,您会在那里看到不包含该=符号的字符串。

于 2012-09-03T15:30:40.317 回答