如何调试生成静态库的源代码?

问题描述 投票:0回答:1

我正在处理一个复杂的 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)?


到目前为止我做了什么

  1. 我能够附加到进程,但我只能调试模型源代码,它是可执行文件的直接源代码。
  2. 下面这是我在 vscode 中使用的
    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

注意:我是提问新手,所以如果我在问题格式上有错误,请纠正我,我会尽力学习和修复。

c++ debugging makefile static-libraries vscode-debugger
1个回答
0
投票

如何调试生成静态库的源代码?

首先:您调试的是可执行文件,而不是库或源代码。调试器本身附加到可执行文件!

我有一个使用静态库 libtrick.a 的可执行文件,我想调试生成该库的 .cpp 服务。

不,您调试从源代码编译的可执行文件。对于静态库,它与直接从源代码构建相同。静态库只是一种特殊的文件格式,它收集一个或多个目标文件。

您的调试器需要使用哪个源文件来生成目标文件的信息,无论它是直接从源代码构建还是通过静态库构建,都是独立的。要获取此信息,您需要在启用调试选项的情况下进行编译

-g
,对于您在静态库中收集的文件也是如此。

如果您现在在调试环境中启动可执行文件,系统将自动指向您用于创建可执行文件的源。而且所有符号都可用!

提示:请注意,在将目标文件链接到静态库中之前,不要删除它们。一些构建脚本默认执行此操作!不知道你是否使用手工制作的

Makefile
或者某些 IDE 生成的一堆晦涩难懂的东西 :-)

项目 makefile 不允许我在其 make all 命令上使用 -g,但我会尝试在编译服务的 .o 文件时添加 -g

大多数预先生成的 Makefile 都可以选择通过环境变量添加其他标志

CXXFLAGS
您可以检查是否可以在编译源代码之前简单地设置
CXXFLAGS
。也许您可以在这里分享您的 Makefile 所需的部分,以获得一些如何处理它的建议。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.