我对如何破解这个错误的想法很少。我有1000行代码,每2或3次运行崩溃。它目前是一个用C语言编写的原型命令行应用程序。问题是它是专有的,我不能给你源代码,但我很乐意在Debian Squeeze x86_64机器上向任何勇敢的灵魂发送调试编译的可执行文件。 / p>
这是我到目前为止所得到的:
当我在GDB中运行它时,它总是成功完成。
当我在Valgrind中运行它时,它总是成功完成。
问题似乎来自一个非常基本的递归函数调用。为了在这个递归函数中指出错误,我在一个单独的应用程序中编写了相同的函数。它总是成功完成。
我构建了自己的gcc 4.7.1编译器,用它编译了我的代码,我仍然得到了同样的行为。
将我的应用程序移到另一台机器上以消除硬件问题的风险,我仍然会遇到相同的行为。
将我的源代码FTped到另一台机器上以消除构建环境损坏的风险,我仍然得到相同的行为。
应用程序是单线程的,没有可能导致竞争条件的信号处理。我memset(,0,)
所有大型物品
没有外来的依赖关系,ldd如下所示。
ldd给了我这个:
ldd tst
linux-vdso.so.1 => (0x00007fff08bf0000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe8c65cd000)
libm.so.6 => /lib/libm.so.6 (0x00007fe8c634b000)
libc.so.6 => /lib/libc.so.6 (0x00007fe8c5fe8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe8c67fc000)
那里有什么工具可以帮助我吗? 如果你在我的位置,你的下一步是什么?
谢谢!
这就是让我走向正确方向的原因 - 我已经使用了-Wall。
感谢!!!这真让我疯狂。
答案 0 :(得分:3)
我在评论中建议:
-Wall -Wextra
进行编译并改进源代码,直到没有给出警告为止; -g
和-O
进行编译;这有助于使用gdb
检查转储的核心文件(您可能希望设置足够大的coredump大小限制,例如内置ulimit
bash)ltrace
或strace
显然-Wextra
很有帮助。很高兴理解为什么以及如何。
答案 1 :(得分:0)
在这种情况下,我认为你有一些内存问题(请仔细查看valgrind的输出),因为GDB和valgrind通过添加一些内存跟踪功能来更改原始程序(因此您的原始地址已更改)。您可以使用-ggdb
选项进行编译并设置coredump(ulimit -c unlimited
),然后尝试分析正在发生的事情。此链接可以帮助您:
http://en.wikipedia.org/wiki/Unusual_software_bug
问候。