Personal tools
You are here: Home ブログ 井上 Reversible debugging in GDB
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

Reversible debugging in GDB

FSFのフリーソフトウェアの優先プロジェクトのリスト(http://www.fsf.org/campaigns/priority.html)に、"Reversible debugging in GDB"というのがあります。

説明からすると、次のことができそうです。

次のような関数呼び出しがあるプログラムをデバッグするとします。

a
|
+-b
| +-c
|
+-d
  +-e

関数aがbとdを呼び出し、bとdがそれぞれcとeを呼んでいます。eの途中でブレークした時、関数cの処理にバグの原因がありそうだと予想して関数cの呼び出し時点に戻りたいことがあります。しかし、こういうことは普通できません。時々、できればいいなと夢想したことがありますが、そんなことは無理だと思っていました。

"Reversible debugging in GDB"でこれができそうです。

無理だと考えた理由は、これを実現するには、スタック領域、ヒープ領域、スタティックなデータ領域(bssおよび非bss)、これらをまとめてデータ領域と呼ぶとすると、ある時点のデータ領域全体の状態をどこかに記憶しておく必要があるからです。例えば、関数aが関数bを呼び出す直前のデータ領域全体の状態が記憶できれば、関数cの呼び出し時点に戻ることができます。しかし、これは全く現実的ではないと思っていました。言うなれば、ネイティブレベルの「継続」だからです(http://dev.ariel-networks.com/Members/inoue/continuations)。

概念上、fork(2)をすると、親プロセスの仮想メモリ全体の複製を行えます。普通のOSはcopy on writeのため、forkした時点でメモリの複製はしませんが、概念上はデータ領域全体の複製ができることになります。

関数aが関数bを呼び出す直前でforkして、その子プロセスを停止したまま、親(元)プロセスの実行を進めます。その後、関数aがbを呼ぶ直前に戻るためには、停止中の子プロセスからデータ領域をコピーして戻す必要があります。ユーザ空間だけで行うなら、なんらかのプロセス間通信により、データ領域をごっそり元に戻す必要があります。copy on writeしたページ分だけをコピーできれば効率的ですが、これをユーザ空間から知るシステムコールがあるかは寡聞にして知りません。その後、PCやSPなどのレジスタを戻せば、関数aがbを呼ぶ直前に戻れます。

理屈上はこれで動作しそうですが、どうでしょう。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/reversible-debug/tbping

Re:Reversible debugging in GDB

Posted by morita at 2008-10-09 07:49
Valgrind を使いメモリ書き込みなどを全て記録する方法で実現しようとしている人もいますね。
http://code.google.com/p/chronicle-recorder/
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.