gdb如何调试头文件_VsCode配置gdb(首次成功)

2d38b80c3bb6433e37d187edada5cf14.png

发现Ctrl+F1

ef7b4fefb6a07beab7679d45f8a36df2.png

首先看一下是不是环境变量被配置好了

3df1c0fb17598cef90ebdec2d6ac9b76.png

接着运行一串命令,建立这样的文件目录

5cb97c0df1bd084ad4caed68efa732fc.png

.vscode在工作区的文件夹中创建的三个文件:

  • tasks.json (制作说明)

  • launch.json (调试器设置)

  • c_cpp_properties.json (编译器路径和IntelliSense设置)

f845920cf5adc3340ad53f2bef3d7dfb.png

Ctrl+S是对当前文件保存

ctrl+k(然后s)对当前所有的文件保存

a859a67e97e4938de5a387ac7ccb0a8c.png

或者开启自动保存文件

7034d7d2115258f16deeb77ea7810141.png

可以按Tab键插入选定的成员。然后,当您添加左括号时,您将看到有关函数所需的任何参数的信息。

编译helloworld.cpp 

接下来,您将创建一个tasks.json文件来告诉VS Code如何构建(编译)程序。该任务将调用g ++编译器以基于源代码创建可执行文件。

从主菜单中,选择Terminal > Configure Default Build Task。在下拉列表中,将显示任务下拉列表,其中列出了C ++编译器的各种预定义构建任务。选择g ++。exe构建活动文件,该文件将构建编辑器中当前显示(活动)的文件。

dc25e9e2a8972c7d10a5784c03bbc8cd.png

点这里配置任务

0bd668ddf3bd1025b643e63b93530d5d.png

点这地方

d0b41be60cc7e1ef9f162847a4aeafe3.png

command设置指定要运行的程序;在这种情况下是g ++。该args数组指定将传递给g ++的命令行参数。必须按照编译器期望的顺序指定这些参数。该任务告诉g ++获取活动文件(${file}),对其进行编译,然后在当前目录(${fileDirname})中创建一个与活动文件同名但.exe扩展名为(${fileBasenameNoExtension}.exe)的可执行文件,helloworld.exe以我们的示例为例。

8d5c6d79db032f1887947a69ddfc3616.png

该label值就是您将在任务列表中看到的值;您可以随意命名。13fc50f03cbfa172d2607bc5bcd23740.png

对象中的"isDefault": true值group指定当您按Ctrl + Shift + B时将运行此任务。此属性仅出于方便起见;如果将其设置为false,您仍然可以使用“任务:运行构建任务”从“终端”菜单运行它

1ad44dbda31ad071038cac6d8dea8067.png

Ctrl + Shift + B

cf3920ce7a3f9e3753faca90c92360ac.png

这个大纲有点好看

69649443a0a1853641f42b23baa5ba7e.png

编译成功

Ctrl + Shift + B

71ba3726e8c6e4fba6fa8c7a0aa43656.png

生成了文件

311a8b1f4236973bc7f3529eb1a99f00.png

打印的结果

修改task.json 

您可以tasks.json使用"${workspaceFolder}\\*.cpp"代替的参数来修改以构建多个C ++文件${file}。这将生成.cpp当前文件夹中的所有文件。您也可以通过替换"${fileDirname}\\${fileBasenameNoExtension}.exe"为硬编码的文件名(例如"${workspaceFolder}\\myProgram.exe")来修改输出文件名。

cfd7d0190b4c1f4d943c2daabdc20162.png

549515f9131d03c6937c9648bb093fce.png

1890aa74b9d0c7f0edf35c11a7cad30c.png

d9988672d0cdce77f7c7d60558e6f5c1.png

调试helloworld.cpp 

接下来,您将创建一个launch.json文件,以配置VS Code以在按F5调试程序时启动GDB调试器。

  1. 从主菜单中,选择“运行” >“添加配置...”,然后选择“ C ++(GDB / LLDB)”。

  2. 然后,您将看到各种预定义调试配置的下拉列表。选择g ++。exe构建并调试活动文件。

d293230eac6e0506d8aa6e98d1ff5668.png

6f5ca027b23f1b6a83f0fdaafe153adb.png

program设置指定要调试的程序。在这里,它被设置为活动文件文件夹${fileDirname}.exe扩展名的活动文件名${fileBasenameNoExtension}.exe,如果helloworld.cpp是,则为活动文件helloworld.exe

默认情况下,C ++扩展名不会在源代码中添加任何断点,并且其stopAtEntry值设置为false

stopAtEntry值更改true为会导致调试器main在启动调试时在该方法上停止。

注意:该preLaunchTask设置用于指定启动前要执行的任务。确保它与task.json文件label设置一致。

d8d88d6c6f988a99a564b649a704a4d6.png

program设置指定要调试的程序。在这里,它被设置为活动文件文件夹${fileDirname}.exe扩展名的活动文件名${fileBasenameNoExtension}.exe,如果helloworld.cpp是,则为活动文件helloworld.exe

3f0f9bd1bc523123ae6c52943a12075b.png

默认情况下,C ++扩展名不会在源代码中添加任何断点,并且其stopAtEntry值设置为false

stopAtEntry值更改true为会导致调试器main在启动调试时在该方法上停止。

a0f90f0740dc88cebcaf01fce456455c.png

注意:该preLaunchTask设置用于指定启动前要执行的任务。确保它与task.json文件label设置一致。

079c41d104cdd0e716e9f707b6981077.png

报错了

81726ba37af8c7ab1aade3df5ce6ed34.png

调试器的路径不对

30c3d5572dd456b5b6894120bd08b5db.png

然后加路径

8a6ff7760d124adc5939867453ac8509.png

需要加个\

d944dbb7c5ffcba8a3304f6d4630adfb.png

接着F5键

5f362efda5c02dbe342878c27b410ac3.png

可以单步执行

a729e4bbbf16ca0097469b316470563c.png

ec4d6f190d4c541258cd18034e094174.png

跳进for循环

这会将程序执行推进到for循环的第一行,并跳过在创建和初始化变量时调用的vectorstring类内的所有内部函数调用msg。注意左侧“变量”窗口中的更改。

819d7d74770ff09e908a246ba35d2a42.png

在这种情况下,将出现错误,因为尽管调试器现在可以看到循环的变量名,但该语句尚未执行,因此此时无任何内容可读取。的内容msg是可见的,但是,因为该声明已完成。

4cfbdf8a97b0a568d2c0c440218de302.png

这个按钮可以关闭所有的断点

7ae69ca32fad520b41ccf881f96124b4.png

F9

36a3c24d88845e41b7c614d9acfb6e1e.png

bdeb6f502844b5a0391b5562be6529cb.png

d8b771f0932898370073c86c5da5f3b2.png

d5646ccad7a859e2e88dd4a8b8b26a1a.png

bb65c5204e144936d3882ad34c8a620d.png

再次按Step over前进到该程序中的下一条语句(跳过为初始化循环而执行的所有内部代码)。现在,“变量”窗口显示有关循环变量的信息。

b7903953326d9ccd325f4bfc0afc0d78.png

a3739291d5e46fc7163dd92e7e07c316.png

efc47ad11fe225f9be14e3f634718aed.png

db8cb2bb751682933a6c77ce4d7d7105.png

e9c5ca04ad11141c3cdc32a1a6915d41.png

6bf61399bddb3bd5e4dd7a19b5e9854f.png

e9515288d0d78f6841a800463866f203.png

如果愿意,可以继续按Step over,直到将引导程序中的所有单词都打印到控制台为止。但是,如果您感到好奇,请尝试按“跳入”按钮以逐步浏览C ++标准库中的源代码!

c72bd5cd081aef3d0f33b544d2816134.png

5ad1d286c2a7f43e5085fbdcda511dab.png

要返回自己的代码,一种方法是按住“跳过”。另一种方法是通过helloworld.cpp在代码编辑器中切换到选项卡,将插入点放在cout循环内的语句中的某个位置,然后按F9来在代码中设置断点。在左侧的装订线中出现一个红点,指示已在此行上设置断点。

795f6cf8518fb47b3a8e32ad1d07f823.png

希望在程序执行时跟踪变量的值。您可以通过在变量上设置监视来做到这一点。

  1. 将插入点放在循环内。在“监视”窗口中,单击加号,然后在文本框中键入word,这是循环变量的名称。现在,当您逐步执行循环时,请查看“监视”窗口。

  2. 379dd2f10a4104afb65d7acf9a8f2aab.png

ab1fa789a62362c3b4700dcb53d38e0d.png

69f76fa9806337987a838b57a7b05d0d.png

15b0515576d1a7e45043a8c52a48f95a.png

377bd455462cc629cecbec59d0f6dd07.png

115bfef89e54cc3b06ac8de1787eaa95.png

f906495a4dc7f914ab5dd7b050c90d8b.png

1c09d1672f8cd3401c4aae6eb9ff8a55.png

db3908facd29fa9b02b64b141d4ec986.png

163373a4ac22c636aa5d1edcef6c7413.png

a84080192090a0917de63be9669c35f9.png

8822f6b74f0a06524a0191848735a32a.png

bd1ab3dd1b2a312b08dc33ebeb54e577.png

f33e4b7d204106357925ec78e5e7724c.png

编译器的路径

该扩展名使用该compilerPath设置来推断C ++标准库头文件的路径。当扩展知道在哪里可以找到这些文件时,它可以提供诸如智能补全和“转到定义”导航之类的功能。

C / C ++扩展尝试compilerPath根据在系统上找到的内容使用默认的编译器位置进行填充。该扩展在几个常见的编译器位置中查找。

5dd3ab51bbcb04c02485dcb6a703c040.png

compilerPath搜索顺序是:

  • 首先检查Microsoft Visual C ++编译器

  • 然后在Windows Subsystem for Linux(WSL)上寻找g ++

  • 然后是用于Mingw-w64的g ++。

777139067e9f3da83a2db65b7ecb16e4.png

转到定义

b6276f05635af5f5a8858335d7fe8e05.png

看头文件的路径

c5bc10cc6d738e36764ccbce715d3a62.png