リモートデバッグ


CygwinのgdbからCentOSのgdbserverに接続してみる

WindowsでLinuxのプログラムをデバッグしたい

Linuxで動かすアプリケーションをWindows環境で開発を進めようとして、苦労したので記録しておきます。
環境は次のようになっています。

  • ターゲット
    • OS
      CentOS 7 (1511)
      アーキティクト
      x86_64
    • gdb
      バージョン
      7.6.1-80.el7
      アーキティクト
      i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, s390:64-bit, rs6000:6000, rs6000:rs1, rs6000:rsc, rs6000:rs2, powerpc:common64, powerpc:common, powerpc:603, powerpc:EC603e, powerpc:604, powerpc:403, powerpc:601, powerpc:620, powerpc:630, powerpc:a35, powerpc:rs64ii, powerpc:rs64iii, powerpc:7400, powerpc:e500, powerpc:e500mc, powerpc:e500mc64, powerpc:MPC8XX, powerpc:750, powerpc:titan, powerpc:vle, powerpc:e5500, powerpc:e6500

  • ホスト
    • OS
      Windows 10 Pro (1607) (Cygwin)
      アーキティクト
      x86_64
    • gdb
      バージョン
      7.10.1
      アーキティクト
      i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, i386:nacl, i386:x86-64:nacl, i386:x64-32:nacl

Linuxで動くアプリケーションをWindows環境からデバッグをするには、Linuxでgdbserverを起動してWindowsからCygwinのgdbで操作することで実現できます。
しかし、標準のgdbで64bitのターゲットを操作しようとすると、 (gdb) target remote ホスト名またはIPアドレス:ポートポート番号 Remote debugging using ホスト名またはIPアドレス:ポート番号 warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration of GDB. Attempting to continue with the default i386:x86-64 settings. warning: Architecture rejected target-supplied description Remote register badly formatted: T0506:0000000000000000;07:d0e5ffffff7f0000;10:30c4ddf7ff7f0000;thread:p8c6.8c6;core:0; here: 00000000;07:d0e5ffffff7f0000;10:30c4ddf7ff7f0000;thread:p8c6.8c6;core:0; (gdb) とエラーが出ます。
どうやらホストのgdbとターゲットのgdbで、アーキティクトが異なっていると判定されてしまっているようです。
これを解消するためにホストのgdbを再構築します。
gdbのソースをFree the Software!のサイトから取得します。
今回は、gdb-7.10.1.tar.gzを使うことにします。
Cygwin環境下でコンパイルを進めますので、Cygwinのユーザのホームディレクトリにダウンロードします。(例: C:\cygwin\home\ユーザID)
Cygwinターミナルで、ソースの展開、コンパイルを行っていきます。
$ tar zxvf gdb-7.10.1.tar.gz $ cd gdb-7.10.1 $ ./configure --host=x86_64-pc-cygwin --target=x86_64-redhat-linux-gnu $ make 基本は以上なのですが、途中でエラーが発生したので、対処が必要でした。
x86_64-pc-cygwin-arがないとエラーがでたので、ar.exeのハードリンクを作成しました。(管理者権限で起動したコマンドプロンプトで実行します。)
> cd c:\cygwin\bin > mklink /H x86_64-pc-cygwin-ar.exe ar.exe x86_64-pc-cygwin-ar.exe <<===>> ar.exe のハードリンクが作成されました termcap.hがないとエラーがでたので、libncurses-develライブラリをインストールしました。
念のためコンパイルをやり直しておきます。
$ make clean $ make gdbディレクトリにgdb.exeが出来上がっていることが確認できます。
インストールは、出来上がったgdb.exeをcygwinのbinディレクトリに移動します。
起動してみます。
$ gdb GNU gdb (GDB) 7.10.1 Copyright (C) 2015 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=x86_64-pc-cygwin --target=x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". 設定したhostとtargetが確認できました。
アーキティクトを確認してみます。
(gdb) set arch Requires an argument. Valid arguments are i386, i386:x86-64, i386:x64-32, i8086, i386:intel, i386:x86-64:intel, i386:x64-32:intel, i386:nacl, i386:x86-64:nacl, i386:x64-32:nacl, auto. (gdb) ん?変わってないんじゃない?
でも接続できたので、良しとしてきます。