gpt4 book ai didi

c++ - 我可以获得未处理(目标)C++ 异常的堆栈跟踪吗?

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

我正在开发一个 iOS 应用程序,该应用程序最近发展了一个大型 C++ 基础。 C++ 不是我的强项,我对异常感到沮丧。我正在寻找的是一种获取(未处理的)异常抛出站点的堆栈跟踪的方法。我会说“未处理”限定符是可选的;我会接受在任何异常抛出时中断作为最后的手段,尽管未处理的异常是理想的。

我目前得到的是无用的。假设我在调用堆栈的上层没有任何合适的异常处理程序,我会做类似的事情

std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range

应用程序将在 main() 中中断,我将收到一条日志消息,内容为“终止调用引发异常”。没有帮助。

将通用的 try/catch block 放在调用堆栈的更高位置也无济于事,因为调用堆栈在异常处理期间展开直到 catch block 的位置,让我对异常的实际来源一无所知。这也适用于提供我自己的 terminate_handler。断言更有用,但它们要求我在某种程度上预测错误情况,而我不能总是做到这一点。我仍然希望调试器能够介入,即使意外异常使其超过了我先发制人的 assert()s。

我想避免的是必须将每个可能抛出异常的调用包装在 try/catch block 中,只是为了获取错误的堆栈跟踪。在运行时,我真的对捕获这些异常不感兴趣。当它们出现时,意味着程序执行存在致命缺陷,无法正常执行。我只是想收到通知,以便确定原因并解决问题,以免再次发生。


在 Objective C 中,我可以在 objc_exception_throw 上放置一个符号断点,任何时候我搞砸了,我都会立即中断执行并显示一个漂亮的堆栈跟踪,这样我就知道问题出在哪里是。很有帮助。

我意识到这种行为之所以真正有用,是因为两种语言在异常处理方面存在理念上的差异。 Objective C 异常仅用于表示不可恢复的错误。例行错误处理的任务是通过错误返回代码完成的。这意味着任何 Objective C 异常都非常适合作为开发人员的断点。

C++ 似乎对异常有不同的用途。它们用于处理 fatal error 例程错误(至少在我使用的第 3 方库中)。这意味着我可能实际上不想中断 C++ 中抛出的每个异常,但如果我不能只中断未处理的异常,我仍然会发现该功能很有用。

最佳答案

您可以在 Xcode 中快速建立对所有 C++ 抛出条件的中断:

  • cmd+6
  • +”按钮->添加异常断点
    • C++ -> std::out_of_range
    • throw

更新

如果您过滤掉了很多,您可能更愿意:

  • 创建符号断点
  • Symbol = __cxa_throw(可能因标准库而异)
  • 操作 > 调试器命令 = bt
  • eval = On 后自动继续

bt 命令记录回溯。这样配置,会自动继续。

因此,这将只记录每个抛出的异常的回溯 - 当您的程序由于未处理的异常而终止时,线索将出现在最终记录的回溯中(通常是最后一个,除非库重新抛出)。

关于c++ - 我可以获得未处理(目标)C++ 异常的堆栈跟踪吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9506737/

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