【发布时间】:2009-11-06 22:43:22
【问题描述】:
我运行我构建的 Qt 应用程序:
./App
Segmentation fault
我用 strace 运行它:
strace ./App
execve("./App", ["./App"], [/* 27 vars */]) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Process 868 detached
再一次,没有有用的信息。
我用 gdb 运行它:
(gdb) run
Starting program: /root/test/App
Reading symbols from shared object read from target memory...(no debugging symbols found)...done.
Loaded system supplied DSO at 0xffffe000
Program received signal SIGSEGV, Segmentation fault.
0x00000001 in ?? ()
再一次,什么都没有。
我用 valgrind 运行它:
==948== Process terminating with default action of signal 11 (SIGSEGV)
==948== Bad permissions for mapped region at address 0x0
==948== at 0x1: (within /root/test/App)
即使我输入了调试符号,它也没有提供更多有用的信息。 ldd 显示所有被正确链接的库。
还有其他方法可以找出问题所在吗?我什至无法进行标准的 printf、cout 等调试。可执行文件甚至似乎根本没有开始运行。
我用符号重建,并尝试了下面的建议
(gdb) break main
Breakpoint 1 at 0x45470
(gdb) run
Starting program: /root/test/App
Breakpoint 1 at 0x80045470
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0xffffe000
Program received signal SIGSEGV, Segmentation fault.
0x00000001 in ?? ()
我检查了静态初始化程序,但似乎没有。
是的,我尝试了 printf、cout 等。它甚至没有进入主例程,所以我正在寻找链接库中静态初始化程序的问题,并将它们一一添加。我也没有得到任何堆栈跟踪。
【问题讨论】:
-
尝试在 gdb 中执行 'run' 之前在 main (break main) 处设置断点,并在可能的情况下单步执行每一行。
-
可能是其中一个链接库中有静态初始化程序。由于链接可能不正确(可能是不同的架构或 32/64 位差异,但不确定这种事情会如何发生),这听起来绝对像是 libc 和/或静态初始化程序的错误。
-
您是否尝试从 gdb 获取回溯?
-
谢谢大家,它似乎是 boost::filesystem 中的静态初始化程序。我删除了引用并将其替换为标准代码,现在一切正常。