Skip to content

umaumax/gdb-hook

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gdb

how to build

g++ -g3 -std=c++11 ./main.cpp -o main
g++ -g3 -std=c++11 -shared -fPIC hook.cpp -o libhook.so
g++ -g3 -std=c++11 ./main_hook.cpp -o main_hook

how to run

# terminal A
LD_PRELOAD=./libstop_the_world.so:./libhook.so ./main

# teminal B
sudo gdb

attach $PID

source ./gdb-trace.py
trace-functions .*_hook

# terminal A
fg

# terminal B
c
c
  • gdbを利用する場合にはrdynamic関係なしに、共有ライブラリから実行ファイルの関数を呼び出すことが可能
    • gdbが実行ファイルからシンボルテーブルを作成しているので,共有ライブラリがそれを見つけることができるということ?
  • main_hookの場合、実行ファイルにhookするコマンドのシンボルを実行前に探すことができるので、下記の手順のようにわざわざattachする必要なしにhook可能
  • 実行ファイルをリンクするときに-rdynamicを付加とすると、共有ライブラリから実行ファイルのシンボル情報を動的に取得できるようになる
  • ちなみに,仮に,main.cppaddXXX_hookを呼び出すようにして、-L. -lhookを下記のコマンドに付加した際に、-rdynamicが無いと共有ライブラリ側からaddXXXが見つからずにエラーとなる

umaumax/stop-the-world

finish

finish直後は p or p $0 で返り値がわかる

アーキテクチャ依存で下記でもよい x86: print $eax x86_64: print $rax

frameからリターンしている状態、つまり、関数を抜けていることに注意(info argsの表示内容が異なる)

return

現在のframe(関数)の返り値を上書きできる

つまり、代替関数を呼んでreturnすると関数の置き換えができる

info args

  • info argsは引数となっている変数の現在の値を出力する
    • frame内で処理を進めていき,変数の中身が変化するとそれに対応して変化する

関数から戻る直前にbreakpointを設定したい

rustとc++が混在してる実行ファイルをデバッグしたとき

明示的に下記のような言語指定をしないと、gdb.executeなどでコマンドを実行する際に、余計な文字列も出力されてしまう

set language c++

memo


FYI: gdbで関数のトレースをするpython script

Trace all function calls using gdb

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published