当我在 Linux 中使用 gdb 调试我的 C++ 程序时?我用 -g 编译,事实上,我在调试器中看到了很多信息,但它一直告诉我我的程序正常退出并且没有显示任何错误。 但是,当我刚刚运行我的程序时,它没有完成并显示并非一切正常(malloc.c 中的一个断言失败)。
我也遇到过这种情况,gdb 和运行程序显示了不同的错误消息。错误总是与错误的指针、内存访问有关。
valgrind 实际上也是如此。是否有可能无法使用 valgrind?特别是如果包含不同的进程和共享库?
通过以下方式使用 valgrind 运行它:valgrind --trace-children=yes prog1 不会给我任何错误(我不可能是真的),如果我通过以下方式启用被抑制的错误:valgrind -v --trace-children=yes prog1,我收到有关重定向冲突的警告(看起来也不像错误)。
最佳答案
错误程序的问题在于它们的行为是未定义的。它们有时会正常工作,有时会意外崩溃。
Valgrind 和 GDB 都会影响程序时序,并可能隐藏竞争条件(这可能发生在多线程和多进程程序中)。
此外,GDB 禁用地址空间随机化,使程序中的地址在每次运行中都可重复。这通常是您在调试时想要的,但您的崩溃可能只会在共享库的特定随机布局时出现,而该布局可能永远不会在 GDB 下发生。
最好的办法是启用核心转储生成(ulimit -c unlimited
),在 GDB 外部运行程序并让它中止(失败的 assert
调用 中止
)。获得内核后,使用 GDB 对其进行调试:gdb/path/to/your/executable core
。
对于您所描述的问题,Valgrind 通常是更好的工具。如果涉及多个进程,您需要使用 --trace-children=yes
标志运行 valgrind。
关于c++ - 运行我的程序的 gdb 和运行我的程序的 bash 显示不同输出的原因可能是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6709362/