訂閱
糾錯
加入自媒體

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

2021-03-25 14:12
一口Linux
關注


#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();

編譯運行gcc編譯時加上-rdynamic參數(shù),通知鏈接器支持函數(shù)名功能(不加-rdynamic參數(shù)則無函數(shù)名打。

gcc 123.c -o run -rdynamic -g

執(zhí)行結果:

4. 補充 address2line

同一個函數(shù)可以在代碼中多個地方調(diào)用,如果我們只是知道函數(shù),要想知道在哪里調(diào)用了該函數(shù),可以通過address2line命令來完成,我們用第2步中編譯出來的test2來做實驗(address2line的-f選項可以打出函數(shù)名, -C選項也可以demangle):

address2line

三、內(nèi)核代碼中如何打印函數(shù)棧?

在Linux內(nèi)核中提供了一個可以打印出內(nèi)核調(diào)用堆棧的函數(shù) dump_stack()。

該函數(shù)在我們調(diào)試內(nèi)核的過程中可以打印出函數(shù)調(diào)用關系,該函數(shù)可以幫助我們進行內(nèi)核調(diào)試,以及讓我們了解內(nèi)核的調(diào)用關系。

1. 頭文件

該函數(shù)頭文件為:

#include <asm/ptrace.h>

使用方式:

直接在想要查看的函數(shù)中添加

dump_stack();

2. 舉例

測試代碼如下: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權限下操作

結果

可以看到在函數(shù)ccc中使用dump_stack()打印出了ccc的函數(shù)調(diào)用棧。

在內(nèi)核開發(fā)中,我們可以使用dump_stack()來打印相關信息,同時在內(nèi)核源碼學習中也可以用來了解函數(shù)調(diào)用關系。


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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

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