精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

18成人在线观看| 中国精品18videos性欧美| 亚洲成av人在线观看| 精品一区二区国产| 中文亚洲av片在线观看| 婷婷久久国产对白刺激五月99| 91精品一区二区三区久久久久久 | mm1313亚洲国产精品美女| 国产成人av影院| 国产va免费精品高清在线| 999精品在线视频| 免费观看成人www动漫视频| 欧美性猛片aaaaaaa做受| 精品免费久久久久久久| 成人动漫在线播放| 成人亚洲精品久久久久软件| 国产精品免费在线免费| 国产亚洲成人av| 精品国产不卡| 日韩电影免费在线观看中文字幕| 视频免费1区二区三区| 丁香花在线高清完整版视频| 国产精品久久久久天堂| 国产专区一区二区三区| 国产乱码久久久| 久久成人亚洲| 色伦专区97中文字幕| 91人妻一区二区三区| 美女网站视频一区| 福利一区福利二区微拍刺激| 国产a级黄色大片| 久久99精品久久久久久野外| 久久欧美一区二区| 国产一区二区三区四区五区在线| 国产精品久久久久久久久久久久久久久久| 欧美亚洲专区| 色综合色综合久久综合频道88| 少妇视频在线播放| 免费看成人哺乳视频网站| 精品久久久久久亚洲综合网| 91香蕉视频免费看| 日韩一区二区三区四区五区| 欧美在线色视频| 各处沟厕大尺度偷拍女厕嘘嘘| 日韩三级免费| 亚洲精品国产品国语在线app| 亚洲一区二区三区精品动漫| 国产在线三区| 久久精品人人做| 欧美精品国产精品久久久| 亚洲精品字幕在线| 成人性生交大片免费看中文网站| 亚洲综合中文字幕68页| 国产欧美综合视频| 国产一区二区三区高清播放| 91免费看国产| www.国产.com| 国产一区二区不卡在线| 69堂成人精品视频免费| 国产肥老妇视频| 国产成人精品www牛牛影视| 亚洲自拍偷拍第一页| 精品人妻无码一区二区色欲产成人| 精品一区二区三区视频| 91老司机在线| www.av日韩| bt欧美亚洲午夜电影天堂| 久久精品国产一区二区三区日韩| 亚洲av成人精品毛片| 久久久午夜精品理论片中文字幕| 欧美色图亚洲自拍| 成人在线视频成人| 中文字幕一区二区三区乱码在线| 在线观看日韩羞羞视频| 黄色在线播放网站| 亚洲成人自拍偷拍| 能在线观看的av| av在线不卡精品| 欧美精品黑人性xxxx| 在线观看欧美一区二区| 国内精品偷拍| 亚洲性夜色噜噜噜7777| 视频国产一区二区| 一区二区亚洲| 日韩av日韩在线观看| 在线免费a视频| 国产风韵犹存在线视精品| 久久国产精品 国产精品| 成人性生交大片免费看午夜| 亚洲欧洲综合另类在线| heyzo亚洲| 精品女同一区二区三区在线观看| 日韩欧美国产综合一区| 香蕉视频黄色在线观看| 日韩亚洲一区在线| 久久久久久有精品国产| aaa在线视频| 国产美女在线精品| 欧美亚州在线观看| 亚洲淫性视频| 91久久免费观看| 亚洲视频在线不卡| 国产精品午夜一区二区三区| 久久这里只有精品视频首页| 天堂在线免费观看视频| 国产真实乱子伦精品视频| 久久99精品久久久水蜜桃| 中文日本在线观看| 激情亚洲一区二区三区四区| 一级黄色片国产| 色狼人综合干| 欧美老少配视频| 中文字幕第三页| av在线不卡电影| 99热这里只有精品7| 日本免费一区二区三区四区| 日韩欧美在线一区二区三区| 性欧美一区二区| 亚洲一本视频| 91久久久久久国产精品| 国内在线免费高清视频| 亚洲成av人影院在线观看网| 91日韩精品视频| 精品国产乱码久久久久久果冻传媒| 国模吧一区二区三区| 国产偷人妻精品一区二区在线| 久久精品一区二区三区四区| 大j8黑人w巨大888a片| 久久的色偷偷| 久久久国产视频91| 中文字幕 自拍偷拍| 26uuu色噜噜精品一区二区| 女人色极品影院| 国产精品一区三区在线观看| 中文字幕精品www乱入免费视频| 日韩三级一区二区三区| 国产成人综合网| 特级西西444| 伊人亚洲精品| 日韩视频免费在线观看| 中文精品久久久久人妻不卡| 久久久一区二区三区| 免费成人在线视频网站| 麻豆一区二区| 97色在线观看| 天天综合网在线观看| 亚洲成人免费电影| 波多野结衣加勒比| 一区免费视频| 久久大片网站| 都市激情亚洲一区| 精品性高朝久久久久久久| 在线观看亚洲欧美| 久久亚洲精品小早川怜子| 国产主播在线看| 蜜桃tv一区二区三区| 日产精品久久久一区二区福利 | 国产午夜精品美女视频明星a级| 欧美三级午夜理伦| 久久人人爽爽爽人久久久| 国产成人综合一区| 日本一本不卡| 国产自摸综合网| 中文字幕伦理免费在线视频| 日韩精品一区二区三区视频| 国产在线拍揄自揄拍无码视频| 大尺度一区二区| 欧美 日韩 国产在线观看| 亚洲午夜久久| 国产一区二区视频在线观看| а√天堂官网中文在线| 精品久久免费看| 老熟妇仑乱一区二区av| 国产精品网站一区| 日韩精品在线播放视频| 日韩一级大片| 日韩av电影免费观看| 欧洲亚洲精品| 欧美黑人又粗大| 色天堂在线视频| 欧美无人高清视频在线观看| 性生交大片免费全黄| 粉嫩蜜臀av国产精品网站| 波多野结衣之无限发射| 狠狠色丁香婷婷综合影院| 91九色国产视频| xxx.xxx欧美| 亚洲欧美日韩精品久久| 国产一区二区麻豆| 亚洲成精国产精品女| 波多野结衣一二三四区| 国产成人99久久亚洲综合精品| 中文字幕无码精品亚洲35| 精品一区二区三区在线| 91成人免费观看| 性欧美videohd高精| 另类天堂视频在线观看| 天堂av在线7| 在线不卡中文字幕| aaa人片在线| 亚洲免费看黄网站| 精品无人区无码乱码毛片国产| 国产米奇在线777精品观看| 成人三级视频在线播放| 欧美在线91| 亚洲高清视频一区二区| 黄色免费大全亚洲| 91精品视频专区| 三级成人黄色影院| 欧美黄色片免费观看| 91在线直播| 日韩毛片在线观看| 午夜美女福利视频| 欧美日本韩国一区| 黄瓜视频在线免费观看| 亚洲成人精品在线观看| 一起操在线播放| 欧美极品少妇xxxxⅹ高跟鞋| 久久久久久久久免费看无码 | 直接在线观看的三级网址| 亚洲日本中文字幕免费在线不卡| 亚洲成人中文字幕在线| 91精品婷婷国产综合久久竹菊| 免费视频久久久| 亚洲不卡一区二区三区| 婷婷国产成人精品视频| 国产亚洲短视频| aaaaa一级片| 不卡电影一区二区三区| 国产sm在线观看| 久久91精品久久久久久秒播| 国产精品无码专区av在线播放| 亚洲美女少妇无套啪啪呻吟| wwwjizzjizzcom| 911久久香蕉国产线看观看| 亚洲欧洲久久| 日韩欧美大片| 亚洲欧洲另类精品久久综合| 欧美伦理在线视频| 日本成人看片网址| 九九视频免费观看视频精品| 欧美成人蜜桃| 亚洲免费成人av在线| 老牛影视免费一区二区| 日韩三级视频| 精品国产一区二区三| 欧美男人操女人视频| 激情小说网站亚洲综合网| 国产欧美一区二区三区米奇| 国产高清在线一区| 成人春色在线观看免费网站| 超碰97国产在线| 日韩精品一区二区三区中文字幕 | 手机av在线免费观看| 337p日本欧洲亚洲大胆精品| 国内爆初菊对白视频| 亚洲丁香久久久| 五月婷婷丁香六月| 亚洲欧美色图片| 成人综合影院| 久久中文字幕在线视频| 欧美1—12sexvideos| 国语自产偷拍精品视频偷| 天堂√8在线中文| 国产成+人+综合+亚洲欧洲 | 久久xxxx精品视频| 国产嫩草在线观看| 国内久久精品视频| 久久性爱视频网站| 久久久噜噜噜久噜久久综合| 日韩欧美黄色网址| 亚洲精选视频免费看| 日韩av电影网| 色婷婷综合久久久久中文| 伊人网综合在线| 日韩欧美中文字幕精品| 欧美孕妇孕交xxⅹ孕妇交| 这里只有精品视频| 羞羞电影在线观看www| 久久免费视频在线观看| 日韩av中字| 91国产丝袜在线放| 深爱激情综合| 中文字幕在线乱| 国产日韩欧美高清免费| 免费看国产黄色片| 国产电影一区二区三区| 30一40一50老女人毛片| 亚洲欧美综合网| 天天操天天干视频| 欧美人妖巨大在线| 日韩一区二区三区不卡| 中文字幕免费精品一区| 丁香高清在线观看完整电影视频| 日韩av免费在线观看| 韩国一区二区三区视频| 麻豆传媒一区| 欧美成人日本| 熟女少妇精品一区二区| 国产成人免费在线视频| 懂色av蜜桃av| 欧美日韩人人澡狠狠躁视频| 国产美女自慰在线观看| 亚洲欧美一区二区精品久久久| 国产写真视频在线观看| 欧美中文在线观看| aaa国产精品视频| 亚洲精品一区二区三区四区五区| 亚洲午夜极品| 亚洲黄色av片| 国产欧美日韩另类视频免费观看 | 在线观看三级视频欧美| 色呦呦中文字幕| 另类少妇人与禽zozz0性伦| 深夜视频一区二区| 久久精品99久久| 欧美日韩日本国产亚洲在线| 中文字幕国内自拍| 26uuu成人网一区二区三区| 欧美黑人一级片| 88在线观看91蜜桃国自产| 国产精品影院在线| 91成人福利在线| 97色成人综合网站| 四虎永久免费网站| 青娱乐精品视频| 免费毛片视频网站| 欧美午夜片欧美片在线观看| 成人午夜精品福利免费| 美日韩精品视频免费看| 日韩免费在线电影| 亚洲精品美女久久7777777| 欧美亚洲网站| 欧美亚一区二区三区| 午夜久久福利影院| 黄色美女一级片| 欧美极品美女视频网站在线观看免费 | 午夜久久影院| 97人人模人人爽人人澡| 亚洲欧洲精品一区二区三区不卡| 中文字幕第315页| 上原亚衣av一区二区三区| 日本在线精品| 日韩精品伦理第一区| 视频在线观看一区二区三区| 国产成人av一区二区三区不卡| 欧美日韩精品在线播放| 四虎影视在线播放| 97成人在线视频| 免费久久久久久久久| 农村妇女精品一二区| 国产丝袜在线精品| 在线免费观看av片| 久久这里有精品| 成人影院中文字幕| 免费一级特黄毛片| 91丝袜呻吟高潮美腿白嫩在线观看| 日韩毛片在线视频| 精品呦交小u女在线| 欧美理论影院| 中文字幕中文字幕在线中心一区| 久久69国产一区二区蜜臀| 蜜臀久久精品久久久用户群体| 日韩欧美久久久| 日本不卡免费高清视频在线| 品久久久久久久久久96高清| 日韩av成人高清| 久久福利免费视频| 精品久久久久久久久久久久包黑料 | 3d动漫精品啪啪一区二区三区免费| 欧美一区二区三区久久精品茉莉花| 制服.丝袜.亚洲.中文.综合懂| 亚洲成人动漫精品| 高清在线观看av| 2014亚洲精品| 亚洲综合社区| 成人欧美一区二区三区黑人一 | www.久久艹| 亚洲影视综合| 亚洲女人久久久| 日韩福利在线播放| 欧美爱爱视频| 亚洲 欧美 综合 另类 中字| 久久久不卡网国产精品二区| 97人妻精品一区二区三区视频| 久久琪琪电影院| 日韩欧美伦理| 中国免费黄色片| 欧美性videosxxxxx| 日韩精品分区| 日韩免费电影一区二区| 国产精品1024久久| 天天干,天天干| 欧美精品福利在线| 精品国产精品| 国产精品久久久久久久无码| 欧美三级在线看| 牛牛精品一区二区| 午夜探花在线观看| 中文字幕第一区综合|