troushoo

リバース実行を用いた gdb によるデバッグ

プログラムを逆に実行するリバース実行を用いた、gdb によるデバッグ方法を紹介します。
「変数 x が不正な値になっていたが、いつ不正な値になったのか」といった場合のデバッグに便利です。

サンプルプログラム
変数 x の初期値が 0 で、その後 func1() により 1 に変更される、単純なサンプルプログラムを用います。
プログラム終了時から、プログラムを逆に実行し、いつ変数 x が変更されたかを調べます。
「gcc –g gccreverse.c」でビルドしておきます。

#include <stdio.h>
 
int func1(){
   return 1;
}
 
int main(void){
  int x = 0;
 
  x = func1();
  printf("%d\n",x);
 
  return 0;
}

リバース実行を用いて gdb でデバッグ
1. 「gdb a.out」を実行し、gdb 配下でプログラムを実行します。


2. 「start」を実行し、プログラムを main まで実行させます。


3. 「Ctrl + x, a」を押し、わかりやすさのため、ソースコードを表示させておきます。


4. gdb 7 では、「set can-use-hw-watchpoints 0」を実行し、ハードウェア watchpoints を無効にする必要がありました。


5. 「record」を実行し、プログラムの実行の保存を開始します。


6. 「continue」を実行し、プログラムの最後まで実行します。


7. 「reverse-next」を実行し、一つ前のソースコードの行まで実行を戻します。


8. 「watch x」を実行し、変数 x に対して watch を設定します。
変数 x の初期値は 0 であるものの、画面出力では 1 となっていたため、いつ x が変更されたかを、調べるためです。


9. 「reverse-continue」を実行し、リバース実行を開始します。
x の値が変更された場所でプログラムが停止し、どこで変数 x が変更されたのかがわかります。
ここでは「x = func1();」の部分であったことがわかりました。



情報元
CppCon 2015: Greg Law " Give me 15 minutes & I'll change your view of GDB" (英語)

関連記事
Linux で動く PowerShell を LLDB とそのエクステンション libsosplugin.so を用いてデバッグ


  1. 2017/01/23(月) 00:03:44|
  2. Linux
  3. | トラックバック:0
  4. | コメント:0
<<強制終了できないプロセスの原因を、ダンプ / カーネルデバッグで調査 (ドライバーでデッドロック) | ホーム | Windows 10 よりデフォルトでインストールされている、PowerShell のテストフレームワーク Pester>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/329-b10fab1d
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する