我在 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 文档。