来自bt in gdb

时间:2017-12-05 13:16:00

标签: linux gdb backtrace

我在gentoo(3.4.66)计算机上运行服务器应用程序。

有时应用程序会在启动后几乎直接进行段错误,但是当它运行时,根本不会发生任何段错误。出于某种原因,这在发布版本中尚未发生,但仅在调试版本期间发生。 这很令人困惑,因为我通常不得不处理相反的问题。

当我从gdb启动应用程序时,它看起来像这样:

Program received signal SIGSEGV, Segmentation fault.
0xb67db7a9 in ?? () from /lib/libc.so.6
(gdb) bt
#0  0xb67db7a9 in ?? () from /lib/libc.so.6
#1  0x00000002 in ?? ()
#2  0x00000001 in ?? ()
#3  0xb68a0158 in ?? () from /lib/libc.so.6
#4  0x00000040 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

有时看起来像这样:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb1f62b90 (LWP 6624)]
0xb67d81c4 in ?? () from /lib/libc.so.6
(gdb) back
#0  0xb67d81c4 in ?? () from /lib/libc.so.6
#1  0x00000000 in ?? ()

根据我目前所知,腐败的堆栈和那些奇怪的地址(如0x00000001)似乎在某种堆栈粉碎中连接在一起。

其他信息

我已经检查了与assert()表达式相关的内容(例如assert(readFile(filename))在发布模式下无效),但找不到任何内容。

应用程序构建在另一个系统上,而不是运行。就ldd

而言,它们具有相同的库和依赖关系

显示的输出来自应用程序的调试版本

任何人都可以告诉我如何解决这个问题,或者提供一些可能存在问题的提示。也许有办法从堆栈帧的地址中提取一些东西?

修改(已更新)
不幸的是,我只有(发布)libc可用。该机器只具有本地网络访问权限,并且没有安装包装系统(-bash: emerge: command not found

我在我的二进制文件夹中使用此命令从GDB启动应用程序: LD_LIBRARY_PATH=$PWD/usr/local/lib gdb Server-Linux其中“Server-Linux”是调试可执行文件的链接

EDIT2:
感谢@ n.m的暗示。我有valgrind,现在可以用它运行应用程序。它给了我142个丢失记录和:

==15835== LEAK SUMMARY:
==15835==    definitely lost: 544 bytes in 16 blocks.
==15835==    indirectly lost: 8,212 bytes in 2 blocks.
==15835==      possibly lost: 26,192 bytes in 1,062 blocks.
==15835==    still reachable: 141,010 bytes in 800 blocks.
==15835==         suppressed: 0 bytes in 0 blocks.

同样有趣的是:在valgrind(低性能)上运行它确实没有崩溃还有七次尝试。我正在检查比赛条件并保持问题更新

0 个答案:

没有答案