Linux/Unix中查看一個C/C++大工程中所有函數的調用順序,有哪些方法?
01-03
如果工程編譯生成了可執行文件(.elf),用readelf -s out.elf | grep FUNC 可以查看調用的函數,但是順序並不是調用的順序。怎樣才能看到調用順序?或者還有其他方法嗎?
PS:如果手頭只有編譯好的.elf文件,有辦法看到所有函數的調用順序嗎?
所以題主想要的是從ELF里提取出call graph?
類似這樣的?
onlyuser/gen-callgraphHow can I generate a call graph from an unstripped x86 Linux ELF?Function call graph plugin sample使用gprof
Gprof call-graph visualization - Python cookbook - Redmine
動態的:就是跑的時候把走過的函數記錄一下,可以考慮用插裝工具,其實就是大規模設斷點,例如pin。這個結果會取決於函數的輸入。這裡的輸入是廣義的輸入,除了用戶輸入,還會和當前系統狀態有關係。例如,程序包含隨機數,根據不同隨機數調用不同函數,那跑的時候具體哪個函數被調用了就會和random seed有關。這種結果我們說它context sensitive.靜態的:生成control flow graph (CFG),然後對圖直接分析。生成CFG的方法很多,為了方便之後的圖的分析,可以考慮angr+networkx 或者 BAP→dump graph to dot →某些dot圖讀入和分析的代碼。IDA貌似存圖比較麻煩,自動化去搞比較辛苦,但是GUI好,適合直觀感受。這種結果我們說它context insensitive.
調用順序應該看不到吧,有外部輸入,還有條件判斷,不同的環境調用順序是不一樣的,這個只能運行的時候獲得,可以利用鉤子函數,每個函數進入出來的鉤子來記錄
scitools understand,能想到的圖它都能生成,想不到的圖它也能生成。
IDA Pro呀,基本上可以看所有主流格式的可執行程序
帶調試信息編譯,丟IDA pro裡面,愛怎麼看就怎麼看。不過IDA正版比較貴。。。
strace ltrace 之類的可以不?
valgrind
可以用gdb 調試吧,info thread 查看有多少線程,然後分別切換到不同線程查看函數調用~
推薦閱讀:
※編譯器的自舉原理是什麼?
※從哪裡可以得到包含了Python3所支持的所有語法的測試用例?
※關於局部數組和全局數組的運行效率?
※PLT界在近幾年中對哪些問題的研究有重大進展?