当从Linux发行版生成核心文件而不是我们在Dev中运行的核心文件时,会发生什么情况?堆栈跟踪是否有意义?
如果可执行文件是动态链接的,就象您的动态链接一样,GDB生成的堆栈(很可能) 没有 意义。
原因:GDB知道您的可执行文件通过
libc.so.6在address处调用某个东西而崩溃了
0x00454ff1,但它不知道该地址上的代码是什么。因此,它将查看
您的 副本,
libc.so.6并发现该副本位于中
select,因此将其打印出来。
但是
0x00454ff1在您的 客户 副本中选择的机会也
libc.so.6很小。顾客很可能在那个地址有其他程序
abort。
您可以使用
disasselect,然后观察它
0x00454ff1是否在指令中间,或者上一条指令不是
CALL。如果这些条件之一成立,那么您的堆栈跟踪将毫无意义。
但是,您 可以 自助:您只需
(gdb) info shared要从客户系统中获取列出的所有库的副本。让客户将它们焦油起来
cd /tar cvzf to-you.tar.gz lib/libc.so.6 lib/ld-linux.so.2 ...
然后,在您的系统上:
mkdir /tmp/from-customertar xzf to-you.tar.gz -C /tmp/from-customergdb /path/to/binary(gdb) set solib-absolute-prefix /tmp/from-customer(gdb) core core # Note: very important to set solib-... before loading core(gdb) where # Get meaningful stack trace!
然后,我们建议客户运行-g二进制文件,以便于调试。
一个 多 更好的方法是:
- 与建立
-g -O2 -o myexe.dbg
strip -g myexe.dbg -o myexe
- 分
myexe
发给客户 - 当客户得到时
core
,用于对其myexe.dbg
进行调试
您将拥有完整的符号信息(文件/行,局部变量),而不必向客户发送特殊的二进制文件,也无需透露太多有关源的详细信息。



