问题
使用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)
问题
使用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)
举报