如何破解C Linux中的间歇性错误?

时间:2012-07-29 13:49:36

标签: c linux debugging

我对如何破解这个错误的想法很少。我有1000行代码,每2或3次运行崩溃。它目前是一个用C语言编写的原型命令行应用程序。问题是它是专有的,我不能给你源代码,但我很乐意在Debian Squeeze x86_64机器上向任何勇敢的灵魂发送调试编译的可执行文件。 / p>

这是我到目前为止所得到的:

  1. 当我在GDB中运行它时,它总是成功完成。

  2. 当我在Valgrind中运行它时,它总是成功完成。

  3. 问题似乎来自一个非常基本的递归函数调用。为了在这个递归函数中指出错误,我在一个单独的应用程序中编写了相同的函数。它总是成功完成。

  4. 我构建了自己的gcc 4.7.1编译器,用它编译了我的代码,我仍然得到了同样的行为。

  5. 将我的应用程序移到另一台机器上以消除硬件问题的风险,我仍然会遇到相同的行为。

  6. 将我的源代码FTped到另一台机器上以消除构建环境损坏的风险,我仍然得到相同的行为。

  7. 应用程序是单线程的,没有可能导致竞争条件的信号处理。我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。

    感谢!!!这真让我疯狂。

2 个答案:

答案 0 :(得分:3)

我在评论中建议:

  • 使用-Wall -Wextra进行编译并改进源代码,直到没有给出警告为止;
  • 使用-g-O进行编译;这有助于使用gdb检查转储的核心文件(您可能希望设置足够大的coredump大小限制,例如内置ulimit bash)
  • 向同事展示您的代码并解释问题?
  • 使用ltracestrace

显然-Wextra很有帮助。很高兴理解为什么以及如何。

顺便说一句,对于较大的程序,您甚至可以通过MELT扩展它来向GCC添加自己的警告;这可能需要数天时间,而且主要是在大型项目中。

答案 1 :(得分:0)

在这种情况下,我认为你有一些内存问题(请仔细查看valgrind的输出),因为GDB和valgrind通过添加一些内存跟踪功能来更改原始程序(因此您的原始地址已更改)。您可以使用-ggdb选项进行编译并设置coredump(ulimit -c unlimited),然后尝试分析正在发生的事情。此链接可以帮助您:

http://en.wikipedia.org/wiki/Unusual_software_bug

问候。