gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com