我在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(低性能)上运行它确实没有崩溃还有七次尝试。我正在检查比赛条件并保持问题更新