linux:如何查看函數(shù)被哪些函數(shù)調(diào)用過(guò)?
一、問(wèn)題
有個(gè)打印log的函數(shù),想知道該函數(shù)執(zhí)行的時(shí)候,之前執(zhí)行了哪些函數(shù)?
二、分析
在應(yīng)用程序打印函數(shù)棧需要通過(guò)函數(shù)backtrace(),該函數(shù)對(duì)應(yīng)頭文件如下:
#include <execinfo.h>
1、三個(gè)與打印調(diào)用棧相關(guān)的函數(shù)
打印函數(shù)棧需要使用到以下3個(gè)函數(shù)
int backtrace(void** buffer, int size);
函數(shù)功能:用于獲取當(dāng)前線程的調(diào)用堆棧。參數(shù):buffer:它是一個(gè)指針數(shù)組,函數(shù)獲取的當(dāng)前線程的調(diào)用堆棧將會(huì)被存放在buffer中。在buffer中的指針實(shí)際是從堆棧中獲取的返回地址,每一個(gè)堆棧 框架有一個(gè)返回地址。size:用來(lái)指定buffer中可以保存多少個(gè)void*元素。返回值:實(shí)際獲取的指針個(gè)數(shù),最大不超過(guò)size大小。
char** backtrace_symbols (void *const *buffer, int size);
函數(shù)功能:將從backtrace函數(shù)獲取的信息轉(zhuǎn)化為一個(gè)字符串?dāng)?shù)組。參數(shù):buffer:從backtrace函數(shù)獲取的數(shù)組指針。size:是該數(shù)組中的元素個(gè)數(shù)(backtrace函數(shù)的返回值)。返回值:是一個(gè)指向字符串?dāng)?shù)組的指針,它的大小同buffer相同。每個(gè)字符串包含了一個(gè)相對(duì)于buffer中對(duì)應(yīng)元素的 可打印信息。它包括函數(shù)名,函數(shù)的偏移地址,和實(shí)際的返回地址。
注:
1、只有使用ELF二進(jìn)制格式的程序才能獲取函數(shù)名稱(chēng)和偏移地址。在其他系統(tǒng),只有16進(jìn)制的返回地址能被獲取。另外,需要傳遞相應(yīng)的標(biāo)志給鏈接器,以能支持函數(shù)名功能即編譯選項(xiàng)-rdynamic。2、backtrace_symbols生成的字符串都是malloc出來(lái)的,最后需要free該塊內(nèi)存。void backtrace_symbols_fd (void *const *buffer, int size, int fd)
功能:backtrace_symbols_fd與backtrace_symbols函數(shù)具有相同的功能,不同的是它不會(huì)給調(diào)用者返回字符串?dāng)?shù)組,而是將結(jié)果寫(xiě)入文件描述符為fd的文件中,每個(gè)函數(shù)對(duì)應(yīng)一行.它不需要調(diào)用malloc函數(shù),因此適用于有可能調(diào)用該函數(shù)會(huì)失敗的情況。參數(shù):fd:通常填寫(xiě)STDOUT_FILENO
2. 鏈接庫(kù)
在編譯的時(shí)候需要加上**-rdynamic**選項(xiàng)。
-rdynamic
Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen" or to allow obtaining backtraces from within a program.
該選項(xiàng)讓鏈接器將所有符號(hào)添加到動(dòng)態(tài)符號(hào)表中,這樣才能將函數(shù)地址翻譯成函數(shù)名,否則打印的結(jié)果是不會(huì)打印函數(shù)名的。
另外,這個(gè)選項(xiàng)不會(huì)處理static函數(shù),所以,static函數(shù)的符號(hào)無(wú)法得到。
3. 舉例 #include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void fun1();
void fun2();
void fun3();
void print_stacktrace();
void print_stacktrace()
{
int size = 16;
void * array[100];
int stack_num = backtrace(array, size);
char ** stacktrace = backtrace_symbols(array, stack_num);
backtrace_symbols_fd(array,size,STDOUT_FILENO);

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-
馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹(shù)機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-
長(zhǎng)安汽車(chē)母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
最新活動(dòng)更多
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開(kāi)發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書(shū)《柔性:汽車(chē)生產(chǎn)未來(lái)的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專(zhuān)題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 【行業(yè)深度研究】退居幕后四年后,張一鳴終于把算法公司變成AI公司?
- 3 人形機(jī)器人廠商,正在批量復(fù)刻宇樹(shù)G1
- 4 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰(shuí)是“蘋(píng)果”?
- 5 華為公布昇騰芯片三年計(jì)劃,自研HBM曝光
- 6 硬剛英偉達(dá)!華為發(fā)布全球最強(qiáng)算力超節(jié)點(diǎn)和集群
- 7 機(jī)器人9月大事件|3家國(guó)產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 8 谷歌“香蕉”爆火啟示:國(guó)產(chǎn)垂類(lèi)AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 9 00后華裔女生靠?jī)刹緼I電影狂賺7.8億人民幣,AI正式進(jìn)軍好萊塢
- 10 美光:AI Capex瘋投不止,終于要拉起存儲(chǔ)超級(jí)周期了?