上篇讲了搭建开发环境,开始编译程序,这篇讲一下怎么调试程序,加断点,attach到线程。
“在控制器中运行”的意思是用putty等telnet或ssh工具连接到控制器,在其中输入命令。
4、使用Eclipse:调用gdb和gdbserver调试程序
设置远程启动方式为手动
在Eclipse中,点击window->Preferences->Run/Debug->Launching->DefaultLaunchers,选中中间C/C++ Remote Application下面的[Debug],然后在右侧选择GDB (DSF) Manual Remote DebuggingLauncher。这样的设置下,我们需要首先在目标板上手动用gdbserver启动程序,再在Eclipse中启动调试。自动上传并启动的方法我正在探索。
设置调试器
在小甲虫(Debug)按钮右边的下拉箭头上点击,选择Debug Configuration,双击C/C++ Remote Application,就可以新建一个调试设置。
在最上方可以修改调试设置的名字,比如IPC-GS Remote。
在main选项卡上的C/C++ Application输入框选择要调试的可执行文件名(IPC-GS-DBG)
在Debugger选项卡下的main选项卡中的debugger输入框输入arm-none-linux-gnueabi-gdb,其它的复选框都不用选中。
在Debugger选项卡下的Connection选项卡中,连接类型选择TCP, IP填192.168.0.200,端口号填2345。
上传文件
将IPC_GS_DBG上传到控制器中;
将CodeSourcery安装目录中\arm-none-linux-gnueabi\libc\usr\bin中的gdbserver也上传到控制器中;
启动gdbserver
在控制器上执行:
./gdbserver 192.168.0.1:2345 ./IPC_GS_DBG
其中192.168.0.1是你计算机的ip地址,端口号可以随便设置,要跟设置调试器那个步骤中的一样。
这时程序开始监听GDB连接。
启动调试器
在小甲虫(Debug)按钮右边的下拉箭头上点击,下面这时候应该有一项是IPC-GS Remote,点它就可以了。记得设置断点。
5、附加到线程
最烦的是,程序启动了,出问题了,但你不知道哪里出了问题,重新用debug方式启动又有可能不能复现错误。此时可以让gdbserver帮忙连到出问题的线程上,查找问题所在。
查看线程编号
使用top命令可以查看CPU占用率,此时按H键,可以把每个进程展开,从而查看到每个线程的线程号。注意通过代码或者日志判断一下你要调试的线程是第几个启动的,从而推断线程号;或者直接打印一下线程号。
attach到线程
在控制器中执行:
./gdbserver --remote-debug 192.168.0.4:2345--attach 471
其中ip和端口号意义与之前一样,最后一个是线程号。
用Eclipse调用GDB连接到控制器
此处不再赘述,同前
添加断点
注意,此处添加的断点只能在你附加到的线程代码中,如果别的线程也会跑到你的断点,将会导致程序退出。所以一定看好线程号。
至此,程序应该能正常中断,停在你想要的位置了。