我正在处理一个复杂的 C++ 项目。 (模拟环境)。 我有一个源代码,里面有多个服务和应用程序。该项目主要是用 C++ 编写的。 我想对模拟服务进行更改并通过 vscode 使用 gdb 进行调试。
我有一个使用静态库的可执行文件libtrick.a,我想调试生成该库的.cpp服务。该可执行文件由 2 个主要部分组成,其中之一来自 sim_services(库)和模型源代码(.cpp 代码,即物理算法)。
这是 Makefile 中用于生成静态库的部分的片段:
#-------------------------------------------------------------------------------
# Specify the contents of: libtrick.a
#-------------------------------------------------------------------------------
TRICK_LIB = $(TRICK_LIB_DIR)/libtrick.a
SIM_SERV_DIRS = \
${TRICK_HOME}/trick_source/sim_services/ExternalApplications \
${TRICK_HOME}/trick_source/sim_services/Clock \
${TRICK_HOME}/trick_source/sim_services/CheckPointAgent \
${TRICK_HOME}/trick_source/sim_services/CheckPointRestart \
${TRICK_HOME}/trick_source/sim_services/Collect \
.
.
.
etc.
我的问题是我应该如何在 vscode 上调试库的代码(sim_services)?
launch.json
。{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch SimExe",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/trick_sims/Cannon/SIM_cannon_analytic/S_main_Linux_11.4_x86_64.exe",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
// "preLaunchTask": "build your simulation",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
}
您可以在此处查看源代码以进一步了解项目结构:https://github.com/nasa/trick
注意:我是提问新手,所以如果我在问题格式上有错误,请纠正我,我会尽力学习和修复。
如何调试生成静态库的源代码?
首先:您调试的是可执行文件,而不是库或源代码。调试器本身附加到可执行文件!
我有一个使用静态库 libtrick.a 的可执行文件,我想调试生成该库的 .cpp 服务。
不,您调试从源代码编译的可执行文件。对于静态库,它与直接从源代码构建相同。静态库只是一种特殊的文件格式,它收集一个或多个目标文件。
您的调试器需要使用哪个源文件来生成目标文件的信息,无论它是直接从源代码构建还是通过静态库构建,都是独立的。要获取此信息,您需要在启用调试选项的情况下进行编译
-g
,对于您在静态库中收集的文件也是如此。
如果您现在在调试环境中启动可执行文件,系统将自动指向您用于创建可执行文件的源。而且所有符号都可用!
提示:请注意,在将目标文件链接到静态库中之前,不要删除它们。一些构建脚本默认执行此操作!不知道你是否使用手工制作的
Makefile
或者某些 IDE 生成的一堆晦涩难懂的东西 :-)
项目 makefile 不允许我在其 make all 命令上使用 -g,但我会尝试在编译服务的 .o 文件时添加 -g
大多数预先生成的 Makefile 都可以选择通过环境变量添加其他标志
CXXFLAGS
您可以检查是否可以在编译源代码之前简单地设置 CXXFLAGS
。也许您可以在这里分享您的 Makefile 所需的部分,以获得一些如何处理它的建议。