【问题标题】:How to disable stepping in C++ template while walking thru code using GDB?如何在使用 GDB 遍历代码时禁用 C++ 模板中的单步执行?
【发布时间】:2019-09-29 21:43:41
【问题描述】:

我正在尝试使用 GDB 遍历代码,而 GDB 总是尝试显示 C++ 模板源代码,这使得调试不便并且浪费了我很多时间。

GDB 尝试单步执行该函数,当它找不到实现模板的文件时显示错误,或者它跳转到我不想看到的模板代码。

我找不到如何禁用显示/单步进入容器或模板源代码的方法。我想跳过,但我不知道该功能是否可用。

是否可以在使用 GDB 进行调试时禁用单步执行模板?当我为前任跨过。 make_unique 函数,我希望 GDB 不会尝试显示 make_unique 实现。有什么建议吗?

【问题讨论】:

  • 使用next,而不是step?或者,如果您不小心输入了不想调试的函数,请使用finish

标签: c++ templates visual-studio-code gdb


【解决方案1】:

可以使用next 命令跳过函数调用,或使用finish 退出函数。

另一种方法是使用skipskip file 命令。这使得 GDB 总是跳过不需要的函数或源文件,即使在使用 step 命令时也是如此。

然而,这并不总是人们想要的。例如,在调试std::sort 中使用的比较函数时,想直接进入比较函数,跳过所有std::sort 实现。或者想要进入构造函数,跳过std::make_unique 实现。

不幸的是,这在 GDB 中是不可能的(不设置断点)。当跳过一个函数或文件时,GDB 也会跳过所有调用来自该函数或文件的东西。

另一个著名的调试器具有所需的功能,称为Just My Code,但它仅适用于 Windows。

出于某种原因,GDB 的“跳过文件”功能有时被吹捧为等同于“仅我的代码”。它不是。

【讨论】:

  • 谢谢。这很有帮助。我不知道如何告诉 VSCode 使用next 命令而不是step。如果单击step over 按钮时它真的使用step GDB 命令,这应该可以解决我的问题。
  • @sam 看看调试器按钮,图标不言自明
  • 有一个功能请求:sourceware.org/bugzilla/show_bug.cgi?id=23540。但它不太可能像 msvc 那样实现为 JMC,需要编译器检测代码。
【解决方案2】:

skip 是你想要的。您可以跳过函数或文件。

如果您进入一些不需要的代码,您可以使用skip this 跳过您刚刚进入的函数或使用skip file 跳过它所在的文件。

您也可以随时使用skip function_nameskip filename 并在几个字符后按TAB 将使gdb 为您完成名称。

也可以分别使用正则表达式或 glob 文件模式指定函数名或文件名。

对于您总是想跳过的常见内容,您应该将跳过命令添加到主文件夹中的.gdbinit 文件中。例如,我的.gdbinit 中有以下代码。

# Skip the Catch library functions  when stepping into
skip -rfu Catch
skip -rfu _catch_sr

# Skip everything from the std namespace
skip -rfu ^std::
skip -rfu ^gsl::
# Skip everything in SFML workspace
skip -rfu ^sf::
skip -rfu ^arma::
skip -rfu ^Glue

使用正则表达式,这意味着 gdb 将跳过 std 命名空间中的任何内容以及我经常使用的其他一些库中的任何内容,例如 catcharmadillo 等。

对于 glob 模式,您可以执行诸如

之类的操作
skip -gfile /usr/include/c++/9.1.0/bits/*

不幸的是,glob 模式似乎无法处理诸如“某个文件夹的任何子文件夹中的任何文件”之类的东西。如果 gdb 允许诸如

之类的东西,那将非常有用
skip -gfile /home/myuser/.conan/**/*

例如,从.conan 文件夹中跳过子文件夹中的任何文件。这个文件夹是 conan 包管理器安装库的地方。然后使用单个 skip 命令 gdb 不会进入任何外部库代码。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2011-02-06
相关资源
最近更新 更多