2007-06-01から1ヶ月間の記事一覧

ゼロ番地を先頭とするページにマップする

mmapのflags引数にMAP_FIXEDフラグを指定することで、OSの実装によってはゼロ番地を先頭とするページにマップできます*1たとえば、i386以降のCPU, Vine Linux 4.0, gcc-4.1.1を使った環境で以下のコードをコンパイルして実行するとゼロ番地にアクセスできま…

最適化のトリビア

以下のコードがあったとします。 #include <stdio.h> int main(int argc, char* argv[]){ int i; if(argc > 1){ i = 10; } printf("i = %d\n", i); return 0; } これをgcc 4.1.1でコンパイルして実行すると以下のようになります。 $gcc -O2 main.c $./a.out 10 <-----</stdio.h>…

static変数に対応するアドレスを探す(ELF format編)

共有ライブラリ上に存在する、あるstatic変数aのプロセス上でのアドレスを知りたいときがあります。apt-getでインストールした共有ライブラリをデバッグしたい時なんかがそうです。 最近、こういったアドレスを探すことが多いので、忘れないようにメモってお…

仕様書等のリンク集

ソフトウェア実装の際、様々な仕様書を参考にすることがありますが、どんな仕様書がどこにあるのか忘れることがあるのでメモっておきます。仕様書だけではなく、複数の仕様書について言及、比較をしている資料も挙げておきます。 オブジェクトファイルに関す…

補足

バックトレースがうまくとれない件ですが、これに対処しようとした場合、test.rbのdebuggerメソッドでbreakした瞬間に、Ruby言語上のstack frameに関するデータ構造をアセンブラ(C言語)レベルで読み込んで解析する必要があると思います。でも、これを言語…

デバッガの実装(Ruby/Python編)

最後に、Ruby,Pythonのデバッガの実装について調べてみました。Pythonには、pdb。 Rubyにはdebug.rbというデバッガが存在します。 これらは、各言語が提供するフック関数を利用して実装されています。フック関数を設定する関数(メソッド)は以下になります…

デバッガの実装(Java編)

次はJavaのデバッガについて調べました。 背景 Javaプログラムの実行は、Java Virtual Machine(以下JVM)上に存在する仮想的なCPUがbytecode(仮想的なCPUが解釈する機械語)を解釈、処理をしていくことによって、行われます。bytecodeはJavaコードをjavacでコ…