在VSCode中对代码库的各个部分使用不同的makefile进行调试(断点等)



我正在进行一个基于ESP-IDF的项目,该项目在ESP32微控制器上运行。

这个项目有一堆不同的C++库(ESP-IDF称它们为components(。通常情况下,我会编译整个项目,并将其安装在ESP32上,一切都很好。

我一直在写测试,我如何使测试工作与标准构建过程有点不同。对于每一组测试,我只测试我的一个C++组件。(例如"Wireless"或"UserInputs"等(我模拟了我的其余组件和我的代码使用的ESP-IDF代码,这让我只测试"Wireless";"无线";,例如。

为此,我使用了CppUTest和一系列makefile。makefile结构基于以下结构:https://github.com/memfault/interrupt/tree/master/example/unit-testing/minimal

下面是我关注的一篇文章,它描述了makefile/testing设置。https://interrupt.memfault.com/blog/unit-testing-basics#setting-向上cpptest

因此,有一个主makefile,它可以找到所有每个组件的makefile。这些每个组件的makefile指定要编译哪些.cpp文件,在哪些文件夹中查找导入,测试在哪里,等等。所有这些都非常有效。

我所处的情况是,我希望能够在VSCode中运行调试器,以设置断点、暂停执行,并在代码中的给定点检查变量。

只要在测试中这样做就足够了。在我的主要ESP-IDF构建过程中,我不需要调试器。

但我在这种设置下工作是最具挑战性的。因为不只是一个make文件。

这是我想要做的核心。我希望能够设置一个断点,然后告诉我的代码使用给定的.cpp文件列表和头导入位置进行编译。就像那些每个组件的测试生成文件一样。我希望我的代码执行到那个断点,然后在VSCode中给我调味汁。

任何关于我如何在这个方向上工作的建议都将非常有帮助。

我能够解决这个问题。以下是我所做的。。。

首先,我进行了测试。现在,当我在unit_tests/build/中查看时,我看到sub每个make文件的文件夹。在这些子文件夹中有可执行文件。例如,unit_tests/build/data/data_tests

我在我的回购中制作了一个.vscode/launch.json文件。看起来是这样的。。。

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch for Dispatch Component",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/unit_tests/build/dispatch/dispatch_tests",
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description":  "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "(gdb) Launch for Wireless Component",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/unit_tests/build/wireless/wireless_tests",
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description":  "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "(gdb) Launch for Data Component",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/unit_tests/build/data/data_tests",
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description":  "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
]
}

请注意,在该launch.json文件中有多个configurations。每个组件/制造文件一个。每个配置的name表示它用于哪个组件,program字段指向测试构建的可执行文件。

如果我在Data组件中,并且想要进入断点,那么我做什么。

  1. 确保Makefile_data.mk调用的测试符合断点
  2. 在VSCode中单击左侧的Run and Debug按钮。(播放按钮的错误(
  3. 单击Run and Debug顶部的下拉列表,然后选择Launch for Data Component
  4. 热门游戏

现在我的测试运行,当它们到达数据中代码的断点时组件,它们将暂停。非常光滑!

最新更新