VS Code GD调试嵌入式Linux程序无法断点调试

Posted “逛丢一只鞋”

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS Code GD调试嵌入式Linux程序无法断点调试相关的知识,希望对你有一定的参考价值。

问题

使用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命令来举例

步骤命令
预处理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命令详细:

选项含义
“-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)

以上是关于VS Code GD调试嵌入式Linux程序无法断点调试的主要内容,如果未能解决你的问题,请参考以下文章

GDB的non-stop模式

无法在 VS Code 中设置断点调试节点 Typescript

无法在 Django 项目的 VS-code 中激活调试(虚拟环境中的 Django)

STM32/MM32/GD32 IAP跳转到APP后无法进中断

VS Code + Chrome 调试 + nrwl 架构

无法在 TypeScript 中调试 - VS Code