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

yui*_*yui 1 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,我收到警告关于重定向冲突(看起来也不像错误).

Emp*_*ian 6

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

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

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

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

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