c++ - 运行我的程序的 gdb 和运行我的程序的 bash 显示不同输出的原因可能是什么?

标签 c++ linux debugging gdb valgrind

当我在 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/

相关文章:

c++ - 将 std::vector<double> 从 C++ 包装到 C 以便在 Swift 中使用

php - 简单的 PHP : unable to execute C++ from php

visual-studio-2008 - Visual Studio 2008 断点不会被命中

linux - 调试器和查找 ROP 小工具

c++ - 自定义排序 C++ 列表

c++ - 如何获得可用的加速度计读数

c++ - 为什么我在 build 目录中新建的共享库与 install 目录中的拷贝相比具有不同的依赖集?

java - 如何找出与 unix 进程 LWP 关联的进程/任务

linux - BASH - 将包含二进制数的文本文件转换为二进制文件

c - 在 C 中调试堆栈溢出?