<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > C語(yǔ)言的那些小秘密之函數的調用關(guān)系

C語(yǔ)言的那些小秘密之函數的調用關(guān)系

作者: 時(shí)間:2015-03-09 來(lái)源:網(wǎng)絡(luò ) 收藏

  顯示的調用關(guān)系是調試器的必備功能,如果我們在程序的運行中出現了崩潰的情況,通過(guò)的調用關(guān)系可以快速定位問(wèn)題的根源,懂得調用關(guān)系的實(shí)現原理也可以擴充自己的知識面,在沒(méi)有調試器的情況下,我們也可以自己來(lái)實(shí)現顯示函數的調用關(guān)系。在我們自己動(dòng)手寫(xiě)backtrace函數之前,先來(lái)看看glibc提供的backtrace函數的使用。代碼如下:

本文引用地址:http://dyxdggzs.com/article/270700.htm

  #include

  #include

  #include

  #define MAX_LEVEL 4

  static void call2()

  {

  int i = 0;

  void* buffer[MAX_LEVEL] = {0};

  int size=backtrace(buffer, MAX_LEVEL);

  for(i = 0; i < size; i++)

  {

  printf("called by %pn", buffer[i]);

  }

  return;

  }

  static void call1()

  {

  call2();

  return;

  }

  static void call()

  {

  call1();

  return;

  }

  int main(int argc, char* argv[])

  {

  call();

  return 0;

  }

  在此先講解下backtrace()函數的使用:

  int backtrace(void **buffer,int size)

  該函數用來(lái)獲取當前線(xiàn)程的調用堆棧,獲取的信息將會(huì )被存放在buffer中,它是一個(gè)指針列表。參數 size 用來(lái)指定buffer中可以保存多少個(gè)void* 元素。函數返回值是實(shí)際獲取的指針個(gè)數,最大不超過(guò)size大小,在buffer中的指針實(shí)際是從堆棧中獲取的返回地址,每一個(gè)堆??蚣苡幸粋€(gè)返回地址。

  接下來(lái)的任務(wù)就是編譯運行了。

  root@ubuntu:/home/shiyan# gcc -g -Wall sss.c -o p

  root@ubuntu:/home/shiyan# ./p

  輸出結果為:

  called by 0x8048440

  called by 0x804847d

  called by 0x804848a

  called by 0x8048497

  上面的運行結果就是調用者的地址,看起來(lái)還不是那么的直觀(guān),我們使用addr2line工具來(lái)實(shí)現地址到源代碼位置的轉換。

  運行

  root@ubuntu:/home/shiyan# ./p |awk '{print "addr2line "$3" -e p"}'>t.sh;. t.sh;rm -f t.sh

  輸出結果為:

  /home/shiyan/sss.c:12

  /home/shiyan/sss.c:27

  /home/shiyan/sss.c:34

  /home/shiyan/sss.c:40

  接下來(lái)看看在棧中數據的結構。

  

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: C語(yǔ)言 函數

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>