可能是因为gdb运行我的程序并且只是bash运行我的程序会显示不同的输出?

时间:2011-07-15 15:22:36

标签: c++ linux debugging gdb valgrind

当我在linux中用gdb调试我的c ++程序时?我用-g编译,事实上,我在调试器中看到了很多信息,但它一直告诉我程序正常退出并且没有显示任何错误。 当我只是运行我的程序时,它没有完成并显示并非一切都正常(malloc.c中的一个断言失败)。

我也遇到过这样的情况,即gdb并且只是运行程序显示了不同的错误消息。错误是与错误的指针,内存访问相关的alwazys。

同样适用于valgrind。是否有可能无法使用valgrind?特别是如果有不同的流程和共享库?

用valgrind运行它:valgrind --trace-children = yes prog1给我没有错误(我不可能是真的),如果我启用了被抑制的错误:valgrind -v --trace-children = yes prog1,我收到有关重定向冲突的警告(似乎也不是错误)。

3 个答案:

答案 0 :(得分:6)

错误程序的问题在于它们的行为是未定义的。他们有时会工作,而在其他时候会无法预料地崩溃。

Valgrind和GDB都会影响程序时序,并可能隐藏竞争条件(多线程和多进程程序都可能发生这种情况)。

此外,GDB禁用地址空间随机化,使程序中的地址在运行期间可重复。这通常是您在调试时所需要的,但是您的崩溃可能只会出现在共享库的特定随机布局中,并且该布局可能永远不会在GDB下发生。

最好的办法是启用核心转储(ulimit -c unlimited)的生成,在GDB外运行程序并使其中止(assert调用失败abort)。获得核心后,使用GDB进行调试:gdb /path/to/your/executable core

对于你所描述的问题,Valgrind通常是一个更好的工具。如果涉及多个进程,则需要使用--trace-children=yes标志运行valgrind。

答案 1 :(得分:0)

这可能是一个多线程问题,gdb会使它慢下来,以至于你的线程不会发生冲突。也许程序正在运行优化? valgrind说一切都好吗?

答案 2 :(得分:0)

我将使用-Wall启用编译中的所有警告,以便gcc将警告您未初始化的变量,然后在valgrind中运行它。其中一个人应该告诉你这个问题。