linux:如何查看函數(shù)被哪些函數(shù)調(diào)用過(guò)?
#if 0
char ** stacktrace = backtrace_symbols(array, stack_num);
for (int i = 0; i < stack_num; ++i)
{
printf("%s", stacktrace[i]);
}
free(stacktrace);
#endif
}
void fun1()
{
printf("stackstrace begin:");
print_stacktrace();
}
void fun2()
{
fun1();
}
void fun3()
{
fun2();
}
int main()
{
fun3();
}
編譯運(yùn)行g(shù)cc編譯時(shí)加上-rdynamic參數(shù),通知鏈接器支持函數(shù)名功能(不加-rdynamic參數(shù)則無(wú)函數(shù)名打。
gcc 123.c -o run -rdynamic -g
執(zhí)行結(jié)果:
4. 補(bǔ)充 address2line
同一個(gè)函數(shù)可以在代碼中多個(gè)地方調(diào)用,如果我們只是知道函數(shù),要想知道在哪里調(diào)用了該函數(shù),可以通過(guò)address2line命令來(lái)完成,我們用第2步中編譯出來(lái)的test2來(lái)做實(shí)驗(yàn)(address2line的-f選項(xiàng)可以打出函數(shù)名, -C選項(xiàng)也可以demangle):
address2line
三、內(nèi)核代碼中如何打印函數(shù)棧?
在Linux內(nèi)核中提供了一個(gè)可以打印出內(nèi)核調(diào)用堆棧的函數(shù) dump_stack()。
該函數(shù)在我們調(diào)試內(nèi)核的過(guò)程中可以打印出函數(shù)調(diào)用關(guān)系,該函數(shù)可以幫助我們進(jìn)行內(nèi)核調(diào)試,以及讓我們了解內(nèi)核的調(diào)用關(guān)系。
1. 頭文件
該函數(shù)頭文件為:
#include <asm/ptrace.h>
使用方式:
直接在想要查看的函數(shù)中添加
dump_stack();
2. 舉例
測(cè)試代碼如下:hello.c
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <asm/ptrace.h>
4
6 MODULE_LICENSE("GPL");
7 MODULE_AUTHOR("PD");
8 void aaa(int a);
9 void bbb(int b);
10 void ccc(int c);
11
14 void ccc(int c)
15 {
16 printk(KERN_SOH"cccc ");
17 dump_stack();
18 printk("c is %d",c);
19 }
20 void bbb(int b)
21 {
22 int c = b + 10;
23 printk(KERN_SOH"bbbb ");
24 ccc(c);
25 }
26 void aaa(int a)
27 {
28 int b = a + 10;
29 printk(KERN_SOH"aaaa ");
30 bbb(b);
31 }
32
34 static int hello_init(void)
35 {
36 int a = 10;
37
38 aaa(a);
39 printk(KERN_SOH"hello_init ");
40
41 return 0;
42 }
43 static void hello_exit(void)
44 {
45 printk("hello_exit ");
46 return;
47 }
48
49 module_init(hello_init); //insmod
50 module_exit(hello_exit);//rmmod
Makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.symvers *.cmd *.mod.c *.order
endif
編譯安裝模塊
dmesg -c
make
insmod hello.ko
【注意】都在root權(quán)限下操作
結(jié)果
可以看到在函數(shù)ccc中使用dump_stack()打印出了ccc的函數(shù)調(diào)用棧。
在內(nèi)核開(kāi)發(fā)中,我們可以使用dump_stack()來(lái)打印相關(guān)信息,同時(shí)在內(nèi)核源碼學(xué)習(xí)中也可以用來(lái)了解函數(shù)調(diào)用關(guān)系。

發(fā)表評(píng)論
登錄
手機(jī)
驗(yàn)證碼
立即登錄即可訪(fǎng)問(wèn)所有OFweek服務(wù)
還不是會(huì)員?免費(fèi)注冊(cè)
忘記密碼請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
最新活動(dòng)更多
-
7月8日立即報(bào)名>> 【在線(xiàn)會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線(xiàn)下論壇】第三屆安富利汽車(chē)生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠(chǎng)展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身智能機(jī)器人產(chǎn)業(yè)技術(shù)創(chuàng)新應(yīng)用論壇
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專(zhuān)題
- 1 AI 眼鏡讓百萬(wàn) APP「集體失業(yè)」?
- 2 豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
- 3 一文看懂視覺(jué)語(yǔ)言動(dòng)作模型(VLA)及其應(yīng)用
- 4 “支付+”時(shí)代,支付即生態(tài) | 2025中國(guó)跨境支付十大趨勢(shì)
- 5 中國(guó)最具實(shí)力AI公司TOP10
- 6 深圳跑出40億超級(jí)隱形冠軍:賣(mài)機(jī)器人年入6.1億,港股上市
- 7 特斯拉Robotaxi上路,馬斯克端上畫(huà)了十年的餅
- 8 “AI六小虎”到了下一個(gè)賽點(diǎn)
- 9 張勇等人退出阿里合伙人
- 10 AI的夏天:第四范式VS云從科技VS地平線(xiàn)機(jī)器人