徒然ネル

LinuxカーネルとかeBPFとか

itmediaの「main()関数の前には何があるのか」を読んでみる(第三回)

itmediaの「main()関数の前には何があるのか」の連載を読んでわからなかったことや、調べたことをメモする

(作者サポートページ)

 

第三回は"試行錯誤のデバッグで探る、printf()内のポインタ経由での関数呼び出しが行き着く先とは"

 

break mainでrunしたあと、breakしてるのが↓の行なのよくわからんな

breakが貼られる箇所ってどういう規則になってるんだろう?

図2.8: layout asmの状態でブレークする

https://image.itmedia.co.jp/ait/articles/1703/01/r20_Hello03-01.PNG

 

gdbについて調べると使い方ばかり出てきて、原理がわからんな

 

break function だとfunctionのエントリーポイントでブレイクするらしい

ということは、スタックポインタやベースポインタ更新後が関数のエントリーポイントってこと?kprobeやuprobeも同じタイミングなのかな?

break function
function のエントリにブレークポイントを設定します。

https://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_18.html#:~:text=break%20function,%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

vfprintfにブレイク貼ったら、今度もsub命令でスタック確保したあとで止まった
スタック確保後がエントリーポイントなのかな
図2.15: vfprintf()でブレークする

https://image.itmedia.co.jp/l/im/ait/articles/1703/01/l_r20_Hello03-08.PNG

 

アセンブラで深いとこ潜っていくのは、break貼って勧めて関数呼び出し見つけてstepiで呼び出し先の関数に飛んではbreak貼ってを繰り返していくみたい。