gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:57:09 34 4
gpt4 key购买 nike

我正在尝试查找在系统库级别上发生段错误的原因。
我想获得一些关于如何使用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?)

最佳答案

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



Solaris libc的源可用here
您可以通过在getenv上设置断点并查看寄存器来检查其参数。您需要知道所使用的ABI,但这很简单-getenv的参数在寄存器i0中,并且print (char*)$i0提示符下的(gdb)应该显示"TZ"


最后,getenv中崩溃的最可能原因是您早先破坏了环境。特别要注意,此代码是错误的:

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


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

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


您可能会在其中看到不包含 =符号的字符串。

关于gdb - 如何使用GDB分析通往系统库的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12247740/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com