精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux下查看函數被那些函數調用過?

系統 Linux
有個打印log的函數,想知道該函數執行的時候,之前執行了哪些函數?

[[389563]]

 一、問題

有個打印log的函數,想知道該函數執行的時候,之前執行了哪些函數?


二、分析

在應用程序打印函數棧需要通過函數backtrace(),該函數對應頭文件如下:

  1. #include <execinfo.h> 

1、三個與打印調用棧相關的函數

打印函數棧需要使用到以下3個函數

  1. int backtrace(void** buffer, int size); 

函數功能:用于獲取當前線程的調用堆棧。參數:buffer:它是一個指針數組,函數獲取的當前線程的調用堆棧將會被存放在buffer中。在buffer中的指針實際是從堆棧中獲取的返回地址,每一個堆棧 框架有一個返回地址。size:用來指定buffer中可以保存多少個void*元素。返回值:實際獲取的指針個數,最大不超過size大小。

char** backtrace_symbols (void *const *buffer, int size);

函數功能:將從backtrace函數獲取的信息轉化為一個字符串數組。參數:buffer:從backtrace函數獲取的數組指針。size:是該數組中的元素個數(backtrace函數的返回值)。返回值:是一個指向字符串數組的指針,它的大小同buffer相同。每個字符串包含了一個相對于buffer中對應元素的 可打印信息。它包括函數名,函數的偏移地址,和實際的返回地址。

注:

  • 1、只有使用ELF二進制格式的程序才能獲取函數名稱和偏移地址。在其他系統,只有16進制的返回地址能被獲取。另外,需要傳遞相應的標志給鏈接器,以能支持函數名功能即編譯選項-rdynamic。
  • 2、backtrace_symbols生成的字符串都是malloc出來的,最后需要free該塊內存。
  1. void backtrace_symbols_fd (void *const *buffer, int sizeint fd) 

功能:backtrace_symbols_fd與backtrace_symbols函數具有相同的功能,不同的是它不會給調用者返回字符串數組,而是將結果寫入文件描述符為fd的文件中,每個函數對應一行.它不需要調用malloc函數,因此適用于有可能調用該函數會失敗的情況。參數:fd:通常填寫STDOUT_FILENO

2. 鏈接庫

在編譯的時候需要加上**-rdynamic**選項。

  1. -rdynamic 
  2.      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. 

該選項讓鏈接器將所有符號添加到動態符號表中,這樣才能將函數地址翻譯成函數名,否則打印的結果是不會打印函數名的。

另外,這個選項不會處理static函數,所以,static函數的符號無法得到。

3. 舉例

  1. #include <execinfo.h> 
  2. #include <stdio.h> 
  3. #include <stdlib.h> 
  4. #include <unistd.h> 
  5.   
  6. void fun1(); 
  7. void fun2(); 
  8. void fun3(); 
  9.   
  10. void print_stacktrace(); 
  11.   
  12. void print_stacktrace() 
  13.     int size = 16; 
  14.     void * array[100]; 
  15.   
  16.     int stack_num = backtrace(array, size); 
  17.   
  18.  char ** stacktrace = backtrace_symbols(array, stack_num); 
  19.   
  20.  backtrace_symbols_fd(array,size,STDOUT_FILENO); 
  21.   
  22. #if 0 
  23.     char ** stacktrace = backtrace_symbols(array, stack_num); 
  24.   
  25.     for (int i = 0; i < stack_num; ++i) 
  26.     { 
  27.         printf("%s\n", stacktrace[i]); 
  28.     } 
  29.     free(stacktrace); 
  30. #endif 
  31. void fun1() 
  32.     printf("stackstrace begin:\n"); 
  33.     print_stacktrace(); 
  34. void fun2() 
  35.     fun1(); 
  36. void fun3() 
  37.     fun2(); 
  38. int main() 
  39.     fun3(); 
  40.   

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

  1. gcc 123.c -o run -rdynamic -g 

執行結果:


4. 補充 address2line

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

address2line

三、內核代碼中如何打印函數棧?

在Linux內核中提供了一個可以打印出內核調用堆棧的函數 dump_stack()。

該函數在我們調試內核的過程中可以打印出函數調用關系,該函數可以幫助我們進行內核調試,以及讓我們了解內核的調用關系。

1. 頭文件

該函數頭文件為:

  1. #include <asm/ptrace.h> 

使用方式:

直接在想要查看的函數中添加

  1. dump_stack(); 

2. 舉例

測試代碼如下:hello.c

  1.  1 #include <linux/init.h> 
  2.  2 #include <linux/module.h> 
  3.  3 #include <asm/ptrace.h> 
  4.  4  
  5.  6 MODULE_LICENSE("GPL"); 
  6.  7 MODULE_AUTHOR("PD"); 
  7.  8 void aaa(int a); 
  8.  9 void bbb(int b); 
  9. 10 void ccc(int c); 
  10. 11 
  11. 14 void ccc(int c) 
  12. 15 { 
  13. 16     printk(KERN_SOH"cccc \n"); 
  14. 17     dump_stack(); 
  15. 18     printk("c is %d\n",c); 
  16. 19 } 
  17. 20 void bbb(int b) 
  18. 21 { 
  19. 22     int c = b + 10; 
  20. 23     printk(KERN_SOH"bbbb \n"); 
  21. 24     ccc(c); 
  22. 25 } 
  23. 26 void aaa(int a) 
  24. 27 { 
  25. 28     int b = a + 10; 
  26. 29     printk(KERN_SOH"aaaa \n"); 
  27. 30     bbb(b); 
  28. 31 } 
  29. 32  
  30. 34 static int hello_init(void) 
  31. 35 { 
  32. 36     int a = 10;                                                                 
  33. 37  
  34. 38     aaa(a); 
  35. 39     printk(KERN_SOH"hello_init \n"); 
  36. 40  
  37. 41     return 0; 
  38. 42 } 
  39. 43 static void hello_exit(void) 
  40. 44 { 
  41. 45     printk("hello_exit \n"); 
  42. 46     return
  43. 47 } 
  44. 48  
  45. 49 module_init(hello_init); //insmod 
  46. 50 module_exit(hello_exit);//rmmod 

Makefile

  1. ifneq ($(KERNELRELEASE),) 
  2. obj-m:=hello.o 
  3. else 
  4. KDIR :=/lib/modules/$(shell uname -r)/build 
  5. PWD  :=$(shell pwd) 
  6. all
  7.  make -C $(KDIR) M=$(PWD) modules 
  8. clean: 
  9.  rm -f *.ko *.o *.mod.o *.symvers *.cmd  *.mod.c *.order 
  10. endif 

編譯安裝模塊

  1. dmesg -c 
  2. make 
  3. insmod hello.ko 

【注意】 都在root權限下操作

結果

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

在內核開發中,我們可以使用dump_stack()來打印相關信息,同時在內核源碼學習中也可以用來了解函數調用關系。

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2011-04-25 16:35:06

Linux調用

2010-01-12 11:48:59

Linuxitoa函數

2009-08-05 09:40:02

C#調用DLL函數

2020-09-28 08:12:59

CC++時間

2023-10-26 11:37:35

函數Python

2020-01-17 20:00:25

SQL函數數據庫

2023-10-26 11:39:54

Linux系統CPU

2022-05-18 08:00:26

函數劫持JavaScript鉤子函數

2024-01-15 09:15:52

parallel語句函數

2021-11-30 08:44:29

SpringRouter Func函數式接口

2017-03-08 15:39:11

Linuxselect函數

2010-01-28 13:35:41

調用C++函數

2010-07-28 15:29:18

Flex函數

2010-05-31 09:19:53

PHP

2023-12-22 16:39:47

Java函數式接口開發

2023-09-09 12:23:24

函數式接口程序

2020-08-16 10:58:20

Pandaspython開發

2020-09-14 10:34:40

Dubbo

2010-06-18 10:42:51

Linux Acces

2013-01-21 10:27:47

蘋果App Store下架
點贊
收藏

51CTO技術棧公眾號

古装做爰无遮挡三级聊斋艳谭| 国产一区不卡在线观看| 在线观看天堂av| 精品国产三区在线| 激情懂色av一区av二区av| 视频一区二区三区在线观看| 国产精品视频第一页| 99热精品在线观看| 最近免费中文字幕视频2019| wwwxxx色| 成人亚洲网站| 亚洲va欧美va人人爽午夜| 欧美日韩一区二区三区免费| 国产婷婷一区二区三区久久| 校园激情久久| 欧美成人第一页| 国产精品扒开腿做爽爽| 99re6热只有精品免费观看| 在线观看一区二区视频| 黄色三级中文字幕| 欧美日韩在线看片| 成人av网址在线观看| 国产精品色悠悠| 日韩视频在线观看一区| 午夜精品网站| 神马久久桃色视频| a天堂中文字幕| 欧美日韩另类图片| 精品免费国产二区三区| 中国黄色片一级| 素人啪啪色综合| 日韩欧美在线视频| 中文字幕无码精品亚洲资源网久久| 在线播放麻豆| 欧美激情在线免费观看| 欧美三级网色| 视频一区二区在线播放| 成人精品国产福利| 91视频99| 精品国产av一区二区| 精品一区二区三区日韩| 国产欧美欧洲在线观看| 亚洲av无码精品一区二区| 99精品免费| 国内精品视频一区| 精品一区二区三区人妻| 欧美欧美全黄| 久久97精品久久久久久久不卡| 蜜桃av免费观看| 日韩精品dvd| 最近中文字幕日韩精品| 中文字幕伦理片| 成人短片线上看| 国产香蕉精品视频一区二区三区| 中文字幕一区二区三区人妻电影| 日韩手机在线| 亚洲欧美国产高清va在线播| 最新中文字幕视频| 国产99精品| 伊人av综合网| 毛片久久久久久| 999国产精品| 久久五月天综合| 精品无码人妻一区二区三区品| 影音先锋久久精品| 青青精品视频播放| 中文字幕日产av| 久久97超碰国产精品超碰| **亚洲第一综合导航网站| 精品人妻伦一二三区久久| 粉嫩嫩av羞羞动漫久久久| 国产在线观看一区| 国产视频三级在线观看播放| 国产精品欧美一区喷水| 国产精品h视频| 欧美激情成人动漫| 偷拍日韩校园综合在线| 白嫩少妇丰满一区二区| 成人国产激情| 日韩欧美在线综合网| 黄色av网址在线观看| 狠狠做六月爱婷婷综合aⅴ| xxxx性欧美| 精品一级少妇久久久久久久| 久久性天堂网| 92裸体在线视频网站| 五月天婷婷在线观看| 国产欧美日韩精品一区| 香蕉视频免费版| 色偷偷色偷偷色偷偷在线视频| 在线日韩av片| 欧美一级片在线免费观看| 美女毛片一区二区三区四区| 日韩有码在线观看| 久草精品视频在线观看| 麻豆成人av在线| 国产一区二区三区四区五区在线| av在线三区| 午夜电影网亚洲视频| 一级片视频免费观看| 国产图片一区| www.亚洲一区| 日韩中文字幕在线观看视频| 精品在线亚洲视频| 你懂的视频在线一区二区| 激情视频在线观看| 91国内精品野花午夜精品 | 中文字幕有码在线播放| 羞羞答答成人影院www| 欧美在线亚洲一区| 成人乱码一区二区三区| 国产精品全国免费观看高清| 成人免费毛片网| 欧美不卡在线观看| 中文字幕国产精品久久| 日本午夜视频在线观看| 国产999精品久久久久久绿帽| 日韩久久在线| 性欧美又大又长又硬| 日韩一区二区三区免费看 | 国产精品久久久久久久美男| 韩国av永久免费| 亚洲美女区一区| 成人性生交免费看| 国产免费久久| 欧美性做爰毛片| 黄色一级a毛片| 亚洲精品国产高清久久伦理二区| 亚洲综合欧美激情| 国产精品一区二区三区av麻| 国自产精品手机在线观看视频| 99免费在线视频| 国产精品久久久久久福利一牛影视 | 亚洲国产精品人人做人人爽| 黄色三级视频在线播放| 天天做天天爱天天综合网| 国产精品吹潮在线观看| 精品成人一区二区三区免费视频| 亚洲va欧美va人人爽| 成人区人妻精品一区二| 亚洲精品社区| 国产区一区二区| 国产中文在线播放| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 国产欧美1区2区3区| 精品视频无码一区二区三区| 亚洲深夜福利在线观看| 26uuu久久噜噜噜噜| 国产精品国产高清国产| 图片区小说区国产精品视频| 特级西西人体wwwww| 国产精品乱看| 久久久久资源| 26uuu亚洲电影| 国产午夜精品全部视频播放| 自拍偷拍福利视频| 国产精品福利av| 亚洲视频在线不卡| 欧美精品色网| 久久久精品国产一区二区三区| 蜜桃视频www网站在线观看| 日韩精品日韩在线观看| 欧美黄色一级大片| 亚洲国产精品成人久久综合一区 | 国产精品2024| 男的插女的下面视频| 精品国产影院| 国产精品极品在线| 色综合久久影院| 日韩一区二区三区精品视频| 国产在线视频在线观看| 91欧美一区二区| 天天操天天爽天天射| 亚洲精品成人| 国内精品国语自产拍在线观看| 日本在线影院| 色天天综合狠狠色| 亚洲精品一区二区三区蜜桃| 第一福利永久视频精品| 一级片黄色录像| 国产成人8x视频一区二区| 成人一级片网站| 婷婷综合伊人| 国产自产在线视频一区| 福利一区二区三区视频在线观看| 免费91在线视频| 嫩草在线播放| 91精品久久久久久久91蜜桃 | 欧美精品欧美精品系列| 四虎永久在线精品| 国产精品色一区二区三区| 国产裸体视频网站| 天堂久久一区二区三区| 蜜臀av.com| 激情五月综合| 国产精品日韩欧美一区二区| 欧美va视频| 欧美极品第一页| 98在线视频| 日韩成人在线电影网| 国产精品污视频| 一本色道久久综合亚洲精品按摩| 亚洲成人生活片| 久久久99精品久久| 野战少妇38p| 久久精品国产秦先生| 激情网站五月天| 亚洲激情婷婷| 日日噜噜夜夜狠狠久久丁香五月| 妖精视频一区二区三区免费观看| 91系列在线观看| 国产精品久久久久av电视剧| 久久久久久久久亚洲| 老司机在线永久免费观看| 亚洲男人天堂久| 黄色小视频免费观看| 欧美一卡2卡3卡4卡| 老熟妇一区二区三区啪啪| 欧美日韩激情美女| 精品无码m3u8在线观看| 亚洲女子a中天字幕| 免费福利视频网站| 久久奇米777| 男女一区二区三区| 国产成人福利片| 日本高清免费观看| 久久99九九99精品| 久久久久久久久久久久91| 性高湖久久久久久久久| 人妻少妇精品久久| 韩国欧美一区| 久久亚洲国产成人精品无码区 | 波多野结衣av一区二区全免费观看| 日韩一区欧美| 午夜精品一区二区三区在线观看| 日韩人体视频| 欧美日本韩国一区二区三区| 欧美电影完整版在线观看| 国产精品12| 一本色道69色精品综合久久| eeuss一区二区三区| 欧美二区观看| 成人三级在线| 91精品国产乱码久久久竹菊| 97夜夜澡人人双人人人喊| 欧美另类中文字幕| 99精彩视频| www.神马久久| 国产一区二区免费电影| 老司机精品在线| 精品一区久久久| 要久久电视剧全集免费| 欧美资源一区| 残酷重口调教一区二区| 小说区视频区图片区| 午夜欧美在线| 毛片av在线播放| 亚洲国产激情| 成人免费毛片网| 轻轻草成人在线| 污视频网站观看| 国产一区二区三区视频在线播放| 91大神免费观看| 成人午夜电影小说| 好吊日免费视频| 欧美韩日一区二区三区| 国产精品99久久久久久成人| 一区二区三区日韩精品视频| 日本中文字幕在线免费观看| 欧美性猛xxx| 亚洲无码精品在线播放| 日韩一区二区免费高清| 天堂网在线资源| 一区二区av在线| 在线免费观看的av| 97视频com| www.一区| 国产精品.com| 欧美一区二区三区激情视频| 自拍亚洲欧美老师丝袜| 伊人久久大香线蕉av超碰演员| 91传媒久久久| 国产中文字幕精品| a级一a一级在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 久久久久性色av无码一区二区| 五月开心婷婷久久| 在线观看国产黄| 亚洲成人亚洲激情| 超碰97在线免费观看| 欧美黄色片在线观看| 日韩av免费| 国产精品免费在线播放| 欧美日韩中字| 国产精品裸体瑜伽视频| 麻豆91在线播放免费| 欧美大喷水吹潮合集在线观看| 国产精品女人毛片| 午夜毛片在线观看| 3atv一区二区三区| 六十路在线观看| 欧美精品电影免费在线观看| 亚洲欧美在线成人| 精品视频一区二区| 偷偷www综合久久久久久久| 99热在线这里只有精品| 国产精品亚洲专一区二区三区 | 刘玥91精选国产在线观看| 国产亚洲精品日韩| 美女高潮在线观看| 99久久久久国产精品免费| 日本精品三区| 免费无码国产v片在线观看| 国产999精品久久久久久| 天堂а√在线中文在线鲁大师| 久久久久久久久伊人| 国产美女福利视频| 一本色道**综合亚洲精品蜜桃冫| www.天堂在线| 久久天天躁狠狠躁夜夜av| 新片速递亚洲合集欧美合集| 国产免费一区二区三区| 中国精品18videos性欧美| 久久精品午夜福利| 99久久久无码国产精品| 久久久久久久久久99| 69堂精品视频| 五月婷婷在线视频| 国产成人黄色av| 香蕉视频一区| 免费欧美一级视频| av在线播放成人| 久久久久亚洲av片无码下载蜜桃| 91精品综合久久久久久| 日本在线人成| 国产欧美精品一区二区三区-老狼| 精品国产91乱码一区二区三区四区 | 亚洲va韩国va欧美va精品| 亚洲成a人片在线| 免费不卡在线观看av| 久久精品免视看国产成人| 超碰97免费观看| 国产精品 日产精品 欧美精品| 希岛爱理中文字幕| 777午夜精品免费视频| 蜜芽在线免费观看| 91九色精品视频| 亚洲色图插插| 国产大学生av| 亚洲尤物在线视频观看| 理论片中文字幕| 2025国产精品视频| 一区二区三区四区在线看| 久久9精品区-无套内射无码| 久久一夜天堂av一区二区三区| 国产精品久久久久久久久久久久久久久久久 | 欧美日韩国产一区精品一区| 久久久久亚洲av片无码v| 一区2区3区在线看| 人妻夜夜爽天天爽| 欧美一级电影在线| 欧美精品久久久久久| 免费av不卡在线| 亚洲国产综合91精品麻豆| 欧美一区二区黄片| 日本最新高清不卡中文字幕| 精品日产免费二区日产免费二区| 国产一级特黄a大片免费| 国产精品美女www爽爽爽| 国产免费高清av| 欧美极品少妇xxxxⅹ免费视频| 加勒比色综合久久久久久久久| 日韩中文字幕三区| 国产精品青草久久| www.天天干.com| 国产成人极品视频| 成人久久综合| 国产无套精品一区二区三区| 激情成人中文字幕| 日本精品一区二区三区在线播放| 国产99午夜精品一区二区三区| 国产午夜久久| 国产精品久久国产精麻豆96堂| 日韩女优av电影| 中文字幕日本一区二区| 国产日产欧美一区二区| www国产精品av| 国产又黄又大又粗的视频| 国产69精品99久久久久久宅男| 欧美日韩伦理| 国产精品无码自拍| 欧美视频一区二区在线观看| 日本伦理一区二区| 日韩精品在在线一区二区中文| 国产精品亚洲专一区二区三区 | 奇米影视7777精品一区二区| 激情视频在线播放| 自拍偷拍免费精品| 加勒比视频一区| 亚洲综合伊人久久|