6.828: Operating System Engineering (21)
objdump -G の出力を見つつ動作確認してみました。
ちなみに昨晩仕込んだソレは mon_backtrace 手続きで debuginfo_eip を呼び出しております。
int mon_backtrace(int argc, char **argv, struct Trapframe *tf) { // Your code here. int i; unsigned int ebp_ptr = read_ebp(); unsigned int eip_ptr = read_eip(); struct Eipdebuginfo info; debuginfo_eip(eip_ptr, &info);
呼び出し位置の行番号は 68 です。てーかこれ、なんか微妙な違和感があるな。と思ったらもの凄い勘違いをしていた模様。
read_eip って戻り番地を戻すのであれば mon_backtrace の戻り先じゃんか、って思ったら read_eip 自体が関数になっているので read_eip の次の命令なんスね。
なので実質 debuginfo_eip 手続きの呼び出しの箇所になってるということなのか。すごく結果オーライだなぁorz
stab
なんとなくですが構成として
- SO 始点から SO 終点がソースファイル
- 始点の n_value はソースファイル名が盛り込まれている
- SO に囲まれる形でそのソースファイルで定義されている関数 (FUN) が列挙されている
- FUN の始点の n_value は命令の始点アドレスになっている
- FUN に囲まれる形で該当する行番号
- 始点の命令アドレスからの差分が n_value になっている
とりあえず一部のみ、ということで objdump -G の出力を貼っておきます。
422 SO 0 2 f01006a0 3663 kern/monitor.c 521 FUN 0 0 f01008e9 4209 mon_backtrace:F(0,1) 522 PSYM 0 0 00000008 4008 argc:p(0,1) 523 PSYM 0 0 0000000c 4088 argv:p(0,22) 524 PSYM 0 0 00000010 4101 tf:p(0,23) 525 SLINE 0 61 00000000 0 526 SOL 0 0 f01008f2 1335 ./inc/x86.h 527 SLINE 0 240 00000009 0 528 SOL 0 0 f01008f4 3663 kern/monitor.c 529 SLINE 0 65 0000000b 0 530 SLINE 0 68 00000010 0 531 SLINE 0 70 0000001f 0 532 SLINE 0 76 00000023 0 533 SLINE 0 79 00000041 0 534 SLINE 0 78 00000055 0 535 SLINE 0 82 0000005d 0 536 SLINE 0 84 00000069 0 537 SLINE 0 70 0000006b 0 538 SLINE 0 88 0000006f 0 546 SO 0 0 f0100965 0 547 SO 0 2 f0100968 4308 kern/printf.c
n_strx が何故か -1 から始まってます。
- 422 から 546 までが kern/monitor.c の領域
- 521 以降が mon_backtrace 手続きの領域
- FUN には終点の目印が無いみたいです
ということを踏まえて debuginfo_eip とか stab_binsearch などを確認。ちなみに上記は addr が 0xf01008f9 の場合、
- lfile が 423、rfile が 546
- lfun が 522、rfun が 546
- lline が 531、rline が 531 (この時の addr が 0x10)
- addr の 0xf01008f9 から FUN の 0xf01008e9 を引いた値が 0x10
なんとゆーか理解はできたんスけど、stab_binsearch とか微妙スギ。