GDB和GDB Server

gdb是linux c編程標配的調試工具,平時接觸比較多的多是本機隨gcc一塊兒安裝的調試工具。可是,即便是本機的gdb,也常常被printf代替,因此接觸也僅限於知道。html

簡單程序當然能夠用printf,可是複雜的,帶有圖形界面的程序,就不得不使用調試工具,好比,arm的跨平臺圖形程序調試。幸虧Qt Creator支持gdb+gdbserver的方式來進行跨平臺調試。python

基本原理:linux

1. 目標板使用gdb-server來啓動已經編譯好的代碼,執行斷點、分步等調試動做,同時經過網絡反饋調試須要的信息給host。redis

2. host上運行arm-linux-gdb,解析gdb-server傳來的信息,同時,發送斷點、分步等動做給目標板。編程

因此,首要的工做是工具的準備。網絡

 

arm-linux-gdb 以及 gdb-server 的製做,參考這篇:QtCreator 環境使用 remote debug工具

gdb 的簡單使用,能夠參考這篇:gdb 簡單使用ui

 

在遠程調試時,首先,須要在遠程使用 gdbserver 打開要調試的程序,有兩種方式:spa

1) 直接用 gdbserver 打開:debug

gdbserver 192.168.1.230:1234 packet_analyzer

上面一句的意思是,使用 gdbserver 運行程序 packet_analyzer, gdbserver 的監聽地址爲 192.168.1.230:1234

2) attach 到已經在執行的進程上:

gdbserver --attach localhost:1234 16924

上面這句表示,用 attach 的方式打開 gdbserver,調試進程號爲 16924 的程序。

 

而後,在另一邊,使用相應版本的 gdb 來做爲 client 與 gdbserver 鏈接便可:

# arm-linux-gdb
Python Exception <type 'exceptions.ImportError'> No module named gdb: 

warning: 
Could not load the Python gdb module from `/tmp/gdb-7.6/__install/share/gdb/python'.
Limited Python support is available from the _gdb module.
Suggest passing --data-directory=/path/to/gdb/data-directory.

GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) target remote 192.168.1.230:1234
Remote debugging using 192.168.1.230:1234
0x400007c0 in ?? ()
(gdb) file packet_analyzer
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from /home/luo/Documents/time_analyzer_qt/packet_analyzer...done.

至此,gdb 與 gdbserver 就勾搭上了,能夠像在本地調試同樣,對遠程機器上的程序進行調試。

須要說明的是,在調試過程當中,gdbserver 側是不接受 ctrl-c 來終止程序的。退出 gdbserver 目前知道的就兩種方法,在 gdb 側執行 quit,或者在 remote 側使用 killall。

相關文章
相關標籤/搜索