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 とか微妙スギ。