前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++如何快速调试异常位置?

C++如何快速调试异常位置?

作者头像
公众号guangcity
发布2023-12-18 19:05:58
1500
发布2023-12-18 19:05:58
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

1.明确调试的问题

在一个大项目中,很多地方会throw异常,当碰到crash或者抛出异常时,我们需要解决两个问题:

第一:异常的源头:究竟哪里抛出了异常

第二:异常的处理:捕获异常位置

对于异常来说,可能是有我们自己编写的throw触发,也可能是底层库的throw,所以到底是哪里触发的非常难以确认。

所以我们需要解决上述两个问题。

好在,gdb给我们提供了两个重要的命令。

第一个可以使用:

代码语言:javascript
复制
catch throw

第二个可以使用:

代码语言:javascript
复制
catch catch

这样的话,我们便可以处理上述两种场景,快速依据堆栈分析出问题!

除了上述命令,我们可以用help catch列出所有的命令:

代码语言:javascript
复制
catch assert -- Catch failed Ada assertions, when raised.
catch catch -- Catch an exception, when caught.
catch exception -- Catch Ada exceptions, when raised.
catch exec -- Catch calls to exec.
catch fork -- Catch calls to fork.
catch handlers -- Catch Ada exceptions, when handled.
catch load -- Catch loads of shared libraries.
catch rethrow -- Catch an exception, when rethrown.
catch signal -- Catch signals by their names and/or numbers.
catch syscall -- Catch system calls by their names, groups and/or numbers.
catch throw -- Catch an exception, when thrown.
catch unload -- Catch unloads of shared libraries.
catch vfork -- Catch calls to vfork.

值得注意的是,我们可以在上面catch/throw后面加上异常类型。

2.举例实战

下面以一个实际的例子来说明:

代码语言:javascript
复制
class MyException : public std::exception {
 public:
  virtual const char* what() const noexcept { return "This is a custom exception!"; }
};

int main() {
  try {
    throw MyException();
  } catch (const MyException& e) {
    std::cerr << "Caught custom exception: " << e.what() << std::endl;
  } catch (const std::exception& e) {
    std::cerr << "Caught exception: " << e.what() << std::endl;
  }

  return 0;
}

在这段代码中,我在try里面直接抛出了异常,这里项目中可能是一个函数调用,然后函数的函数里面才会去throw,所以比较难以发现,这里就不模拟的,直接throw,那么如何让gdb停在throw这一行一集catch这一行呢?

这就是上面要说的两个场景调试!

2.1 catch throw

gdb之后,输入:

代码语言:javascript
复制
catch throw

然后允许程序即可,可以看到下面断点到了想要的位置

catch throw MyException可以只捕获我们期望的类型。

另外,还可以断点__cxa_throw

2.2 catch catch

同理,gdb之后,输入:

代码语言:javascript
复制
catch catch

也可以:

代码语言:javascript
复制
catch catch MyException

__cxa_begin_catch

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.明确调试的问题
  • 2.举例实战
    • 2.1 catch throw
      • 2.2 catch catch
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档