如何在Linux/g++/gdb中调试VSCode时跳过不必要的函数/文件



我在 ubuntu 上的 VSCode 中有以下代码 (Main.cpp) 并使用 gdb 进行调试:

#include <iostream>
#include <string>
std::string return_string(){//Line 4
std::string abc = "abc";
return(abc);
}

int main(){//Line 9
std::string abc = return_string();//Line 10
std::cout<<abc<<std::endl;//Line 11
return 0;
}

在第 10 行命中断点时,按 F10 希望到达第 11 行反而会带我进入basic_string.h文件,该文件是不属于我的项目的C++文件。有没有办法不输入这样的本机 C/C++ 文件?我看过:

如何防止 GDB 单步执行每个功能

但这似乎在谈论使用 GDB RAW 并建议在 GDB 中指定skip命令 (https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html)。但是,我通过VSCode接口运行调试器,该接口在gdb上提供了一个封装层,而无需用户使用原始gdb命令 -F10步骤,F11步骤等等。

有没有办法通过在编译和链接自身时单步执行代码来防止在调试时输入某些文件?目前,我的 makefile 发出以下命令用于编译和链接:

(compiling) g++ -fno-common -fPIC -fno-strict-aliasing -fexceptions -fopenmp -c -g -std=c++14 -MMD -MP -MF "build/Debug/GNU-Linux/_ext/1/Main.o.d" -o build/Debug/GNU-Linux/_ext/1/Main.o ../src/Main.cpp 
(linking) g++ -fno-common -fPIC -fno-strict-aliasing -fexceptions -fopenmp -o dist/Debug/GNU-Linux/linux build/Debug/GNU-Linux/_ext/1/Main.o -lm -lpthread -ldl

就像别人说的,我想你说F10(跨步)时指的是F11(步入)。 你已经有了大部分的答案——gdb的skip命令。 (这在MS Visual Studio世界中被称为"NoStepInto"。缺少的部分是您可能希望在运行 IDE 时自动执行这些命令。 为此,请在用户主目录中创建并编辑~/.gdbinit文件。 添加一行以将"安全"路径添加到另一个.gdbinit文件,该文件位于项目的可执行文件文件夹中:

add-auto-load-safe-path /home/your_username/your_project/your_bin_dir/.gdbinit

然后编辑刚刚引用的项目特定.gdbinit文件,并添加要自动执行的命令(每行一个)。 例如,当您执行"单步执行:"时,此.gdbinit会跳过std命名空间内的任何内容。

skip -rfunction ^std::.*

-rfunction选项指定正则表达式,但还有其他方法可以指定要跳过的函数;请参阅 gdb 文档。

最新更新