訂閱
糾錯(cuò)
加入自媒體

linux:如何查看函數(shù)被哪些函數(shù)調(diào)用過?


#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ù)則無函數(shù)名打。

gcc 123.c -o run -rdynamic -g

執(zhí)行結(jié)果:

4. 補(bǔ)充 address2line

同一個(gè)函數(shù)可以在代碼中多個(gè)地方調(diào)用,如果我們只是知道函數(shù),要想知道在哪里調(diào)用了該函數(shù),可以通過address2line命令來完成,我們用第2步中編譯出來的test2來做實(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)核的過程中可以打印出函數(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)核開發(fā)中,我們可以使用dump_stack()來打印相關(guān)信息,同時(shí)在內(nèi)核源碼學(xué)習(xí)中也可以用來了解函數(shù)調(diào)用關(guān)系。


<上一頁  1  2  
聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)