gpt4 book ai didi

c++ - 如何生成事后回溯?

转载 作者:行者123 更新时间:2023-11-28 00:41:52 25 4
gpt4 key购买 nike

当我的 KDE 程序崩溃时(这很常见 :( ),我可以生成一个事后回溯(我想这不是真正的事后,只是错误被捕获并保存)并用它来提交一个如果我安装了调试符号,则会出现错误报告。它是如何工作的以及如何将该功能添加到我自己的程序中?

我现在有一个问题,我用 C++ 编写的程序会间歇性地崩溃,这显然是由于内存管理不善造成的。在gdb下运行这个程序对我来说是非常不切实际的,因为它是一个大规模的模拟,需要几个小时才能运行,而且只有在系统规模非常大的时候才会出现崩溃。能够自动将回溯转储到文件中可以节省我很多时间。

我假设它涉及将所有内容包装在某种 try{}catch(){} 例程中,但我如何从中获得有用的回溯?有没有更好的办法?我所有的编程都是在 Linux 上进行的,如果这会影响答案的话。

最佳答案

你不能使用try/catch,因为它们需要一个正确的程序,而你遇到的崩溃是因为你的程序是格式错误/不正确/损坏。您通常不能使用确定性编程来解决非确定性损坏的代码。一开始就避免编写损坏的代码(使用 Clang 的 asan/tsan/ubsan 和 Valgrind 等工具,并编写测试),或者使用一种在您出现编程错误时不会变成病态的语言(例如 Java 或 Python) .

通常发生的情况是,当操作系统由于某些非法操作(例如非法指令或非法内存访问)而终止您的进程时,它会在进程从系统中删除之前创建该进程的核心转储。核心转储包含整个内存内容(或多或少),并且包括所有正在运行的线程的堆栈跟踪。

一些现代操作系统通过管道将核心转储传输到处理它的程序,例如通过将其上传到软件供应商进行分析。你可以做类似的事情,尽管你必须用你的操作系统来安排它。不过,发送正在运行的线程的堆栈跟踪可能就足够了,而不是整个内存。

您还可以通过使用库(libunwind?)或通过附加调试器来创建正在运行的程序的堆栈跟踪,这会中断程序,但通常没有太大用处 - 唯一有趣的堆栈跟踪是非法操作发生的地方,因为您想知道那个操作是什么。

关于c++ - 如何生成事后回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505961/

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