使用gdb和gdbserver除錯Android C/C++程式

王慶發表於2013-08-26

1,http://www.gnu.org/software/gdb/download/,下載最新版本的gdb原始碼包,我使用的是gdb-7.6.tar.gz,使用tar命令進行解包(tar -xvzf gdb-7.6.tar.gz),cd進gdb-7.6/gdb目錄,使用vi找到remote.c中的如下程式碼:
if(buf_len > 2 * rsa->sizeof_g_packet)

  error(_("Remote 'g' packet reply is too long: %s"),rs->buf);

將上面兩行註釋掉,新增如下程式碼

if(buf_len > 2 * rsa->sizeof_g_packet)
{
   rsa->sizeof_g_packet = buf_len;
  for(i = 0; i < gdbarch_num_regs(gdbarch); i++)
   {
    if(rsa->regs[i].pnum == -1)
      continue;
    if(rsa->regs[i].offset >= rsa->sizeof_g_packet)
      rsa->regs[i].in_g_packet = 0;
    else
      rsa->regs[i].in_g_packet = 1;
  }
}
使用如下命令對程式碼進行配置、編譯和安裝

./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v

make

make install

2,gdbserver使用android4.2模擬器中自帶的版本(v7.1)

3,將NDK編譯好的C/C++可執行程式,上傳到模擬器中/data/test目錄下,假設可執行程式的名稱為testHello。

4,使用命令:gdbserver :7000 /data/test/testHello 啟動模擬器端的除錯。

5,啟動arm-linux-gdb之前,使用vi開啟~/.bash_profile檔案,在其中新增:

export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程式的其他目錄可以直接啟動arm-linux-gdb程式

6,cd至ndk編譯好的testHello檔案所在目錄

7,使用如下命令進行埠對映:adb forward tcp:7000 tcp:7000,將模擬器的7000埠和本機的7000埠進行對映

8,使用命令:arm-linux-gdb testHello啟動gdb除錯

9,使用target remote :7000 連結模擬器中gdbserver啟動的服務。

10,自此,我們就可以使用gdb命令進行程式碼除錯了。

相關文章