安卓板子
请移步https://www.cnblogs.com/chenshao107/p/18548660
gdb和gdbserver
一般来说进行,进行嵌入式linux开发时,都会从开发板厂商拿到sdk,里面的工具链就有可用的gdb和gdbserver,所以一般是不需要自己去编译的。常见的比如,如果你用的工具链是arm-linux-gnueabihf-gcc,那你一般能找到arm-linux-gnueabihf-gdb……
可以在对应工具链的目录下find -name gdbserver
找不到的话,顶多也就交叉编译个gdbserver
硬要自己编译gdbserver
https://sourceware.org/gdb/download/
在前者链接里下载你想要的gdb版本,解压后交叉编译gdbserver
export PATH=$PATH:/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
./configure --prefix=`pwd`/__install --host=arm-linux \
CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ \
LD=arm-linux-gnueabihf-ld AR=arm-linux-gnueabihf-ar
make
make install
这里的命令只是参考,因为我并不需要源码编译,编译过程中有错误需要自己搜索寻找解决办法,同时还要检测gdbserver二进制是否生成,因为你并不需要整个gdb项目交叉编译完,你仅仅只是需要gdbserver可执行文件。
编译需要调试的程序
在编译过程中添加-g -O0即可。(并且不要被strip,一般没啥问题)单纯linux的板子一般问题不多,因为用的都是gnu,如果实在怀疑调试的符号信息有问题的话,查看一下我的这篇博客https://www.cnblogs.com/chenshao107/p/18548660
gdbserver启动服务
板子连上网络,tftp将gdbserver推进板子。
./gdbserver :1234 demo
或者
./gdbserver :1234 --attach $pid
别忘了给gdbserver和要调试的二进制添加执行权限。chmod +x gdbserver
vscode连接gdbserver
安装ms-vscode.cpptools拓展,名称: C/C++。由于许多人其实更喜欢使用clangd,C/C++插件占用太多,我后续再看能不能使用其他插件。
点击vscode左边的"运行与调试",添加launch.json,选择cppdbg。
参考配置文件如下
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote Debug",
"type": "cppdbg",
"request": "launch",
"program": "可执行文件的路径(注意,不是板子上的路径)",
"miDebuggerServerAddress": "板子ip:1234",
"miDebuggerPath": "arm-linux-gnueabihf-gdb(选择自己工具链的gdb,绝对路径也行)",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
vscode提前打开对应的.c文件打打断点,点击“运行与调试”界面左边的小绿三角即可连接上了。
so库的调试
如果要调试代码中调用的so库,so库也要添加-g -O0的编译选项,同时有可能需要手动加载so库的调试符号,比如在调试控制台执行file xx.so
?目前我只在安卓使用lldbserver成功过,以后有机会再尝试。