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

3

我在Ubuntu上使用VSCode,调试使用gdb,以下是我要翻译的代码(Main.cpp):

#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++文件呢?我查看了以下内容: How to prevent GDB from stepping into every single function 但它似乎只涉及使用gdb原始代码的情况,并建议在gdb中指定skip命令(https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html)。然而,我通过VSCode界面运行调试器,它提供了一种封装层,使用户不必使用原始的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

学习区分“步入”和“跨越”的区别。很可能你把键盘快捷方式搞混了。 - sweenish
当在第10行设置断点时,按下F10(跳过)会进入basic_string.h,这是否符合预期?能避免这种情况发生吗? - Tryer
如果你真的迈过去了,它就不会这样了。 - sweenish
1
我刚刚在Windows上尝试了一下,gdb的行为符合预期,对于第10行的步过操作会跳转到第11行。 - rioV8
@sweenish 考虑使用标准容器和函数包装器,它们通过密集的标准库代码进行长时间的间接调用后,再调用客户端代码。例如 std::make_uniquestd::function - alter_igel
显示剩余3条评论
1个回答

0
就像别人说的那样,当你说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文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接