gdb+gdbserver遠程串列協議[zz]

來源:互聯網
上載者:User

轉載地址:http://blog.sina.com.cn/s/blog_71ed04f70100qhxc.html

 

gdbserver --debug --remote-debug /mount/hello
Usage:  gdbserver [OPTIONS] COMM PROG [ARGS ...]
        gdbserver [OPTIONS] --attach COMM PID
        gdbserver [OPTIONS] --multi COMM

COMM may either be a tty device (for serial debugging), or
HOST:PORT to listen for a TCP connection.

Options:
  --debug               Enable general debugging output.
  --remote-debug        Enable remote protocol debugging output.
  --version             Display version information and exit.
  --wrapper WRAPPER --  Run WRAPPER to start new programs.
[root@GX3200 /]# gdbserver --debug --remote-debug :3456 /mount/hello
my_waitpid (474, 0x0)
my_waitpid (474, 0x0): status(137f), 474
my_waitpid (474, 0x0)
my_waitpid (474, 0x0): status(1057f), 474
my_waitpid (475, 0x0)
my_waitpid (475, 0x0): status(137f), 475
my_waitpid (475, 0x0)
my_waitpid (475, 0x0): status(9), 475
my_waitpid (474, 0x0)
my_waitpid (474, 0x0): status(117f), 474
my_waitpid (474, 0x0)
my_waitpid (474, 0x0): status(9), 474
new_argv[0] = "/mount/hello"
Process /mount/hello created; pid = 476
sigchld_handler
linux_wait: [Process 476]
linux_wait_for_lwp: <all threads>
my_waitpid (-1, 0x40000000)
my_waitpid (-1, 0x1): status(57f), 476
Got an event from 476 (57f)
stop pc is 400009c0
pc is 0x400009c0
stop pc is 0x400009c0
stop pc is 400009c0
linux_wait_for_lwp: pc is 0x400009c0
Hit a non-gdbserver trap event.
wait_for_sigstop: LWP 476 already stopped
Checking whether LWP 476 needs to move out of the jump pad...no
linux_wait ret = LWP 476.476, 1, 5
Listening on port 3456
handling possible accept event
Remote debugging from host 192.168.1.224
linux_async (0), previous=0
handling possible serial event
[getpkt: discarding char '+']
getpkt ("Hc-1");  [sending ack]
[sent ack]
putpkt ("$E01#a6"); [looking for ack]
[received '+' (0x2b)]
handling possible serial event
getpkt ("qC");  [sending ack]
[sent ack]
putpkt ("$QC1dc#8c"); [looking for ack]
[received '+' (0x2b)]
handling possible serial event
getpkt ("qOffsets");  [sending ack]
[sent ack]
putpkt ("$#00"); [looking for ack]
[received '+' (0x2b)]
handling possible serial event
getpkt ("?");  [sending ack]
[sent ack]
wait_for_sigstop: LWP 476 already stopped
Checking whether LWP 476 needs to move out of the jump pad...no
Writing resume reply for LWP 476.476:1

putpkt ("$T050b:0*"00;0d:403ea0be;0f:c0090040;thread:1dc;core:0;#f7"); [looking for ack]
[received '+' (0x2b)]
handling possible serial event
readchar: Got EOF
[getpkt: discarding char 'ÿ']
Remote side has terminated connection.  GDBserver will reopen the connection.
Listening on port 3456

===========================================================================================

gdb規定目標端起碼應該實現:’g’ ‘G’ ‘m’ ‘M’ ‘c’ ’s’,kgdb當然也有實現了,而且還不
止這些,有一些是和體繫結構沒有太緊密的關係,比如斷點的設定和刪除,kgdb只是記錄
起這個地址,和設定這個斷點的狀態;記憶體的讀取和修改,也許這個和體繫結構有關,但是
具體實現核心已經搞定,kgdb不用關心。另外一方面一些比如’s’逐步執行這種命令就和體
繫結構關係十分密切,x86上是通過設定標誌寄存器的Trap標記,讓cpu運行完下一條指令
後觸發一個debug中斷,其他的體繫結構的做法都有所不同。

‘g’
格式:$g#67
描述:gdb向目標端發送這個命令來擷取目標機當前寄存器的值
回複:+ $123456789abcdef0…#xx
‘+’用來應答’g'這個命令,表明目標端正確地收到這個命令,然後就是目標端的回複包,
gdb規定用8十六進位個數字來表示一個寄存器的值,所以第一個寄存器的值為
12345678,第二個為9abcdef0,依此類推,而具體每個寄存器的含義和寄存器個數又體系
結構決定,定義在gdb的代碼中. 當然這裡8個數字是對32位系統來說的,為什麼是8位?
限於我們這個協議是基於ASCII的,一個十六進位數只能標記4位,那32位自然是8個十六進位數了。

‘G’
格式:$GXXXXXXXXXXX…#xx
描述:和g相反,這個命令用來設定目標機當前寄存器的值
回複: + $OK#9a
OK表示設定成功,後面我們會講到不成功的情況.

‘m’
格式:$m6a1bbb,2#b9
描述:讀取一段記憶體的值,這裡是讀取以6a1bbb位起始地址的兩個位元組
回複: + $f488#0a 目標端把值返回.

‘M’
格式:$Mccc5cc,2:a340#01
描述:設定一段記憶體的值,這裡是把以ccc5cc位開始地址的兩個位元組設成a340
回複: + $OK#9a

’s’
格式:$sADDR#xx
描述:使用者進行單步調試時用到,ADDR指明了程式將從那個地址恢複運行,如果忽略ADDR,程式就從斷點處繼續運行.
回複:+ 目標端會馬上返回資料正確或錯誤接收,但不會馬上返回資訊,具體資訊要到下一次斷點被觸發時才會返回.下面會提到.

‘c’
格式:$cADDR#xx
描述:讓程式恢複正常運行
回複:和’s’一樣.

‘Z’
格式: $ZTADDR,LENGTH#xx
‘Z’命令用來設定斷點或watch點,用過gdb的同志應該不會陌生了
‘T’欄位定義了這個命令的對象,0:軟體斷點,1:硬體斷點,2:寫watch點,3:讀watch點,4:訪問watch點.
‘ADDR’就是我們所關心的記憶體位址,’LENGTH’,對於軟體中斷它指明被斷點指令覆蓋
的記憶體長度,kgdb對於軟體斷點忽略掉它,因為觸發 kgdb的指令與體繫結構相關,已經定義
在kgdb這邊,就如x86的int3在記憶體裡面的二進位指令為”0xcc”;對於硬體斷點和watch 點,
‘LENGTH’指明gdb關注的記憶體長度.

‘z’
格式: $zTADDR,LENGTH#xx
各項與’Z'相同.用來取消斷點。

回複:
錯誤回複:
格式:+ $E01#a6
描述:如果目標端在執行gdb的命令時出錯時返回錯誤回複,比如訪問記憶體時出錯.E後面根
兩位的錯誤碼,錯誤碼在gdb裡面沒有定義,沒有定義其實更加方便,可以讓開發端和目標端
對錯誤碼的使用帶來靈活.

空回複:
格式:+ $#00
描述:當目標端不認識gdb發來的命令時,返回空回複表示自己不支援這個命令.

對’c',’s’的回複:
有好幾種對’c',’s’的回複,其中比較常見的是’S'和’T’
‘S’
格式: $SAA#b8
作用: AA表明觸發這次通訊的那個異常相關的訊號,這個訊號就是posix標準中的訊號.

‘T’
格式: $TAAN..:R..;N..:R..#xx
作用: AA同樣是訊號號, N..:R.. 這表明一個寄存器和它的值,N標記寄存器號,R是它對應的
值,其中,如果N不是一個16進位數而是”thread”,那麼後面R的值就指明當前的進程號.如果
是其它的字串gdb會省略.

Kgdb在回複’s’,'c’時選用了’T'的方式,不過在’T'訊息裡面只有thread一個欄位,沒
有給gdb傳更多的寄存器資訊.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.