我的需求,有一个项目,程序由一个主程序和一堆动态库组成,运行在目标机上,希望能够在开发机上进行远程调试。
于是想到了使用gdbserver来调试,中间碰到一些问题,记录下来
1.demo程序
创建了一个demo程序来模拟,由主程序和动态库两个文件夹,开发机上的目录结构如下
--proj
|---exemain
----exemain.cpp
----|Debug
----|----exemain
|---dlla
----dlla.cpp
----|Debug
----|---libdlla.so
其中exemain调用dlla里的函数mymax
将可执行文件exemain和libdlla.so拷贝到目标机上,确认可以执行
2.目标机上使用gdbserver
在目标机上执行gdbserver :1234 ./exemain 其中1234是端口号
3.在开发机上调试
#cd proj/exemain/Debug
#gdb -q ./exemain
(gdb) target remote 172.103.1.59:1234
(gdb) b main
(gdb) c
(gdb) i shared
(gdb) set solib-search-path ../../dlla/Debug/
(gdb) b mymax
尤其需要注意的是,先在mian处打断点,并且运行到main之后再去设置solib-search-path ,然后再在dlla中的函数上打断点,否则显示的断点并没有源文件行数,推测大概是只有运行进了main之后才会发现dlla库并加载,使用set solib-search-path时才会加载符号和源文件行号,再去打断点才能找到。
4.使用eclipse
目前使用eclipse也存在问题,如果直接使用远程调试的话还是无法进入库文件的源文件中调试,需要在终端中手动输入。
5.在之前gdb成功的基础上具体说一下eclipse怎么配置
工作空间设在proj下,下面有两个项目dlla和exemain。
选中exemain,选择调试下面的调试-配置
双击c/c++ remote application会出现远程调试的设置选项,
填写名称
connection后新建,选ssh only,下一步填写主机名,连接名,下一步
选择c/c++程序后面的搜索项目,选中debug/exemain
在remote absolute file path for c/c++ application后面的浏览中,选中目标机上的可执行文件,需要填写目标机的用户名密码
然后点应用,就可以调试了
但是在调试中还是只能在exemain工程中打断点。如果要在dlla上打断点,需要在gdb终端中手工输入
set solib-search-path ../../dlla/Debug/
然后输入b mymax
再就可以用eclipse调试了