gdbを用いたpintoolのデバグ その1

Intel Pin を用いて投機実行のシミュレーションを行うプログラムのデバグの話。 投機実行のシミュレーション中は本来実行されない path が実行されるので、適宜シグナルの処理が必要。 すなわち、例えば SIGSEGV の場合、シミュレーション中に SIGSEGV が発生したらそれを抑え込む必要がある。 実際に SIGSEGV(に限らず他のシグナルも)が発生した場合には、そのシグナルを抑え込んだ上でシミュレーションを中断する処理を入れている。

問題になるのは、Pintool(シミュレートするプログラム)が何らかのバグで SIGSEGV を発生させ、落ちる場合である。 この時、発生する SIGSEGV は 2 種類ある。それは:

  • 投機実行のシミュレーション中に発生する SIGSEGV : Pintool によって抑え込まれる
  • 何らかのバグで pintool が発生させる SIGSEGV : 放置される(ので、pintool が落ちる

上記が理由で、(デバグのために)pintool が落ちる直前で一時停止するのが困難になる。 さて gdb でデバグしよう。 と思った際に、gdb は上記の 2 種類の SIGSEGV を区別せずに、それが発生したらプログラムを一時停止させる。 従ってcontコマンドを打って、実行が継続する場合と、そのまま pintool が落ちる場合があるからである。

どうやって落ちる直前で止まるか…。 考えられる方法:

  • core dump の解析

つづく

Reference

comments powered by Disqus