青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠,我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數據加載中……

在C/C++程序里打印調用棧信息(轉載)

原文出處  http://blog.csdn.net/yetyongjin/article/details/7759144

以下不能windows + mingw下執行.  windows下參考 http://code.google.com/p/backtrace-mingw/
我們知道,GDB的backtrace命令可以查看堆棧信息。但很多時候,GDB根本用不上。比如說,在線上環境中可能沒有GDB,即使有,也不太可能讓我們直接在上面調試。如果能讓程序自己輸出調用棧,那是最好不過了。本文介紹和調用椎棧相關的幾個函數。
 
NAME
       backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging
SYNOPSIS
       #include <execinfo.h>
       int backtrace(void **buffer, int size);
       char **backtrace_symbols(void *const *buffer, int size);
       void backtrace_symbols_fd(void *const *buffer, int size, int fd);
 
以上內容源自這幾個函數的man手冊。
 
先簡單介紹一下這幾個函數的功能:
l backtrace:獲取當前的調用棧信息,結果存儲在buffer中,返回值為棧的深度,參數size限制棧的最大深度,即最大取size步的棧信息。
l backtrace_symbols:把backtrace獲取的棧信息轉化為字符串,以字符指針數組的形式返回,參數size限定轉換的深度,一般用backtrace調用的返回值。
l backtrace_symbols_fd:它的功能和backtrace_symbols差不多,只不過它不把轉換結果返回給調用方,而是寫入fd指定的文件描述符。
Man手冊里,給出了一個簡單的實例,我們看一下:
 1 #include<execinfo.h>
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<unistd.h>
 5 
 6 void myfunc3(void) {
 7    int j, nptrs;
 8    #define SIZE 100
 9    void *buffer[100];
10    char **strings;
11    nptrs = backtrace(buffer, SIZE);
12    printf("backtrace() returned %d addresses\n", nptrs);
13    /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
14     *  would produce similar output to the following: */
15  
16    strings = backtrace_symbols(buffer, nptrs);
17    if (strings == NULL) {
18        perror("backtrace_symbols");
19        exit(EXIT_FAILURE);
20    }
21  
22    for (j = 0; j < nptrs; j++)
23        printf("%s\n", strings[j]);
24    free(strings);
25 }
26  
27 static void  myfunc2(void) {   /* "static" means don't export the symbol */
28    myfunc3();
29 }
30  
31 void myfunc(int ncalls) {
32    if (ncalls > 1)
33        myfunc(ncalls - 1);
34    else
35        myfunc2();
36 }
37  
38 int main(int argc,char *argv[]) {
39    if (argc != 2) {
40        fprintf(stderr,"%s num-calls\n", argv[0]);
41        exit(EXIT_FAILURE);
42    }
43    myfunc(atoi(argv[1]));
44    exit(EXIT_SUCCESS);
45 }
46  
編譯:
# cc prog.c -o prog
 
運行:
# ./prog 0
backtrace() returned 6 addresses
./prog() [0x80485a3]
./prog() [0x8048630]
./prog() [0x8048653]
./prog() [0x80486a7]
 
這樣,是輸出了調用棧,不過只是以十六進制輸出函數地址而已,可讀性很差。仔細看下man手冊,原來很簡單,編譯時加上個參數:
 
重新編譯:
# cc -rdynamic  prog.c -o prog
通過gcc手冊,我們可以也解下參數的說明:
-rdynamic
           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.
 
再執行:
# ./prog 0
backtrace() returned 6 addresses
./prog(myfunc3+0x1f) [0x8048763]
./prog() [0x80487f0]
./prog(myfunc+0x21) [0x8048813]
./prog(main+0x52) [0x8048867]
/lib/libc.so.6(__libc_start_main+0xe6) [0xaf9cc6]
./prog() [0x80486b1]
 
這回,可以看到函數名了。

posted on 2012-12-17 22:12 Khan 閱讀(1637) 評論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺開發

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区在线观看av| 精品va天堂亚洲国产| 夜夜嗨av一区二区三区四季av | 亚洲线精品一区二区三区八戒| 亚洲激情偷拍| 欧美日韩国产精品一卡| 亚洲一区二三| 欧美一区亚洲二区| 亚洲精品久久嫩草网站秘色| 亚洲精品在线免费| 国产美女高潮久久白浆| 模特精品在线| 欧美三级视频在线播放| 久久九九免费| 欧美激情一二三区| 久久久久久高潮国产精品视| 欧美福利精品| 久久九九全国免费精品观看| 欧美va亚洲va国产综合| 亚洲欧美成aⅴ人在线观看| 久久精品人人爽| 亚洲一二三区精品| 久久综合免费视频影院| 亚洲欧美日韩在线不卡| 久久久人人人| 午夜欧美大尺度福利影院在线看 | 亚洲免费观看在线观看| 国产综合在线看| 亚洲美女精品久久| 亚洲国产高清在线| 亚洲永久精品国产| 亚洲乱码国产乱码精品精98午夜| 香蕉久久一区二区不卡无毒影院| 亚洲激情视频在线观看| 欧美尤物一区| 亚洲伊人网站| 欧美日韩国产精品专区| 欧美电影专区| 国产亚洲日本欧美韩国| 亚洲视频免费在线| 一区二区激情| 欧美大色视频| 欧美国产日韩视频| 黄色工厂这里只有精品| 亚洲欧美另类综合偷拍| 亚洲综合成人婷婷小说| 欧美日韩国产bt| 亚洲激情中文1区| 1024亚洲| 久久亚洲综合色一区二区三区| 欧美一区二区播放| 国产精品视频久久久| 中日韩美女免费视频网站在线观看| 亚洲国产影院| 欧美xxx在线观看| 亚洲丶国产丶欧美一区二区三区| 激情视频一区二区三区| 欧美一区二区三区四区高清| 欧美亚洲日本国产| 国产欧美在线| 欧美一区二区三区视频在线观看 | 欧美黄色日本| 最近中文字幕日韩精品| 欧美gay视频激情| 亚洲国产精品久久久久| 亚洲免费观看视频| 欧美日韩国产一中文字不卡| 99riav久久精品riav| 亚洲一区二区在线| 国产精品视频久久| 久久精品国产99国产精品澳门| 久久久91精品| 亚洲国产另类 国产精品国产免费| 久久一区激情| 亚洲欧洲视频在线| 亚洲欧美制服另类日韩| 国产日韩欧美精品在线| 久久久久成人精品| 亚洲人体一区| 午夜欧美电影在线观看| 国内视频精品| 免费在线视频一区| 一区二区国产在线观看| 久久精品99国产精品日本| 一区视频在线播放| 欧美日韩国产小视频| 亚洲性感美女99在线| 久久躁日日躁aaaaxxxx| 亚洲精品日本| 国产九区一区在线| 免费观看日韩av| 亚洲天堂网站在线观看视频| 久久久久久久综合狠狠综合| 亚洲人人精品| 国产亚洲在线观看| 欧美精品色一区二区三区| 亚洲欧美国产高清va在线播| 欧美14一18处毛片| 亚洲欧美在线免费观看| 亚洲国产精品va在线看黑人| 国产精品成人一区二区艾草| 美女视频黄a大片欧美| 亚洲图片欧洲图片日韩av| 欧美高清视频在线播放| 午夜在线精品| 99这里只有久久精品视频| 国产在线拍偷自揄拍精品| 欧美久久九九| 老司机午夜精品| 亚洲欧美激情四射在线日| 亚洲国产成人精品久久久国产成人一区| 亚洲欧美日韩国产综合在线| 最新亚洲激情| 精品成人一区| 国产欧美亚洲视频| 国产精品v亚洲精品v日韩精品| 另类春色校园亚洲| 久久www成人_看片免费不卡| 亚洲视频一二| 亚洲乱码国产乱码精品精天堂 | 夜夜嗨av一区二区三区四区| 欧美激情中文字幕乱码免费| 久久国产精品高清| 亚洲欧美一区二区原创| 在线一区亚洲| 日韩一级不卡| 亚洲久久一区二区| 亚洲国产一区二区在线| 亚洲高清久久久| 在线观看91精品国产麻豆| 国产在线视频欧美一区二区三区| 国产精品综合| 国产精品天天看| 国产精品一区三区| 国产精品免费观看视频| 国产精品久久久久婷婷| 国产精品人人做人人爽人人添| 欧美日韩日韩| 国产精品九九| 国产伦精品免费视频| 国产欧美日韩一区二区三区在线观看 | 亚洲男女自偷自拍| 午夜亚洲视频| 久久精品国产v日韩v亚洲| 久久精品国产久精国产思思| 久久国产视频网站| 久久亚洲欧美国产精品乐播| 免费在线国产精品| 亚洲高清不卡在线| 亚洲精品免费一二三区| 一区二区国产精品| 亚洲欧美日韩国产另类专区| 欧美一区二区三区另类| 久久免费视频一区| 欧美电影打屁股sp| 国产精品久久久久久福利一牛影视| 国产精品久久久久毛片大屁完整版 | 欧美午夜精品一区| 国产日韩欧美成人| 在线日韩中文| 亚洲视频一区在线观看| 久久av一区| 亚洲风情在线资源站| 一区二区91| 久久久天天操| 欧美日韩精品免费| 国产日韩欧美另类| 亚洲精品在线三区| 亚洲免费在线播放| 免播放器亚洲一区| aa级大片欧美| 久久久伊人欧美| 欧美亚洲成人精品| 亚洲福利一区| 午夜视频一区在线观看| 欧美黄色精品| 亚洲欧美日韩高清| 欧美高清视频一二三区| 国产情侣一区| 一区二区激情| 欧美成人午夜免费视在线看片| 亚洲看片一区| 久久婷婷久久| 国产噜噜噜噜噜久久久久久久久| 最新亚洲一区| 久久亚洲午夜电影| 亚洲性视频网址| 欧美精品亚洲二区| 在线播放日韩专区| 午夜伦理片一区| 亚洲精品乱码视频| 久久亚洲风情| 国产午夜久久| 亚洲欧美综合v| 亚洲精品国产精品国自产在线| 久久gogo国模啪啪人体图| 国产精品久久久久久福利一牛影视| 亚洲精品视频一区二区三区| 老司机免费视频一区二区| 亚洲一区在线观看视频|