嵌入式学习小组
直播中

泡芙奶昔

11年用户 716经验值
私信 关注

VS Code GD调试嵌入式Linux程序无法断点调试的原因?怎么解决?

VS Code GD调试嵌入式Linux程序无法断点调试的原因?怎么解决?

回帖(1)

徐丹

2021-12-24 16:52:15
问题

使用gdb调试嵌入式Linux上的程序时,简单的c代码小程序,通过以下的方法可以正常的调试和运行
Linux嵌入式 gdb VSCode图形化调试教程
但是最近编写的程序比较复杂,代码量也比较多
在程序中打断点会发现没有反应,并且启动gdb之后断点符号是灰色的

板子上的程序也是直接运行,没有按照断点位置停下来
vscode的launch.json

首先是查看vscode这边的launch.json有没有配置正确

{
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "SK_Control(gdb)启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/SK_Control",                                                         // 用于选择被调试的可执行程序路径
            "args": [],
            "stopAtEntry": true,                                                                                // 若为true则启动调试后自动停在main开头
            "cwd": "${workspaceFolder}",                                                                        // 工作目录


            "debugStdLib":true,
            "miDebuggerPath":"/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb", // 修改过
            "miDebuggerServerAddress": "192.168.0.232:6000",


            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",


            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true,
                }
            ],
        }
    ]
}
核心就是

"miDebuggerPath":"/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb", // 修改过


"miDebuggerServerAddress": "192.168.0.232:6000",
可以先用一个小的历程来测试一下gdb服务有没有打通
添加 -g

基本的调试命令
用gcc命令来举例
[tr]步骤命令[/tr]

预处理gcc -E hello.c -o hello.i
编译gcc -S hello.i -o hello.s
汇编gcc -c hello.s -o hello.o
链接gcc hello.o -o hello_elf
gcc命令详细:
[tr]选项含义[/tr]
“-E”只进行预处理
“-S”(大写)只进行预处理和编译
“-c”(小写)只进行预处理、编译和汇编
“-o file”指定生成的输出文件名为file

这个时候需要的debug中常用的指令
-g
在交叉编译时加入-g
修改优化等级 -O0

断点添加不上,还有一个可能就是交叉编译器默认优化等级是 -O2
所以需要修改优化等级

OBJS         =        main.o uart.o crc.o crc_cal.o para.o com_pc.o
EXE     =        SK_control
CFLAGS        =         -lm  -lpthread  -fsigned-char
EX                =   -g -O0


$(EXE) : $(OBJS)
        $(CC) -o $(EXE) $(OBJS) $(CFLAGS)
main.o : main.c debug.h uart.h
        $(CC) -c main.c  $(EX)
uart.o : uart.c uart.h debug.h
        $(CC) -c uart.c  $(EX)
crc.o : crc.c crc.h  debug.h
        $(CC) -c crc.c  $(EX)
crc_cal.o : crc_cal.c crc_cal.h
        $(CC) -c crc_cal.c  $(EX)
para.o : para.c para.h debug.h
        $(CC) -c para.c  $(EX)
com_pc.o : com_pc.c com_pc.h  debug.h
        $(CC) -c com_pc.c  $(EX)


.PHONY : clean
clean :
        rm $(EXE) $(OBJS)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分