我试图找到在系统库级别上发生的段错误的原因。
我想获得一些关于如何使用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?)
答案 0 :(得分:1)
我想获得一些关于如何使用gdb来检查在下面的堆栈跟踪中看到的getenv()调用的args的提示。
getenv
的参数,并查看寄存器。您需要知道所使用的ABI,但这很简单 - getenv
的参数位于寄存器i0
中,而print (char*)$i0
位于{{1}提示应打印(gdb)
。最后,"TZ"
崩溃的最可能原因是您之前已经破坏了环境。请特别注意,此代码错误:
getenv
您通常可以通过以下命令之一检查环境:
void buggy()
{
char buf[80];
strcpy(buf, "FOO=BAR");
putenv(buf); // <-- BUG!
}
有可能,你会在那里看到不包含(gdb) x/100s __environ
(gdb) x/100s environ
标志的字符串。