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

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 閱讀(1643) 評論(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>
            午夜精品久久| 你懂的国产精品| 老司机67194精品线观看| 亚洲国产三级网| 午夜在线成人av| 亚洲精品久久久久久下一站| 国产专区欧美精品| 国产精品一级二级三级| 欧美日韩在线视频一区二区| 你懂的亚洲视频| 母乳一区在线观看| 麻豆精品视频在线观看视频| 欧美一区日本一区韩国一区| 亚洲欧美资源在线| 午夜激情综合网| 亚洲一区免费网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲精品永久免费| 亚洲老司机av| 日韩西西人体444www| 欧美激情亚洲视频| 亚洲福利小视频| 亚洲欧洲综合| 麻豆freexxxx性91精品| 亚洲综合成人在线| 亚洲精选中文字幕| 国产日韩一区在线| 欧美日韩亚洲91| 欧美日韩另类综合| 国产精品美腿一区在线看| 国产女同一区二区| 亚洲国产精品成人精品| 亚洲精品小视频| 午夜亚洲性色视频| 老色鬼久久亚洲一区二区| 美女露胸一区二区三区| 久久综合久久美利坚合众国| 欧美日韩一区国产| 欧美三级电影一区| 亚洲午夜一区二区三区| 国产午夜精品美女毛片视频| 好吊色欧美一区二区三区四区| 国产亚洲成av人在线观看导航| 国内成人精品一区| 99re这里只有精品6| 欧美一区91| 亚洲黄页视频免费观看| 亚洲一区二区三区高清 | 久久久国产精品一区| 老牛国产精品一区的观看方式| 欧美黄色一级视频| 一本到高清视频免费精品| 先锋a资源在线看亚洲| 欧美va天堂| 欧美va亚洲va香蕉在线| 一区二区三区成人精品| 欧美伊人久久久久久午夜久久久久 | 最新中文字幕亚洲| 欧美福利专区| 销魂美女一区二区三区视频在线| 亚洲精品一区二区三| 亚洲电影在线看| 久久国产精品99国产| 欧美一区二区三区在线| 亚洲欧洲日本国产| 久久精品九九| 欧美www在线| 亚洲深爱激情| 欧美精品九九| 亚洲成人直播| 欧美中文在线观看| 99精品国产高清一区二区| 久久亚洲图片| 国产亚洲精品一区二区| 亚洲一区www| 久久只有精品| 午夜精品一区二区三区电影天堂| 欧美在线观看你懂的| 久久亚洲图片| 国产在线精品二区| 久久gogo国模裸体人体| 夜夜爽99久久国产综合精品女不卡| 久久精品欧美| 国产亚洲综合在线| 久久国产福利国产秒拍| 国产精品99久久久久久久久久久久| 久久精品99无色码中文字幕| 欧美激情久久久| 国产精品v片在线观看不卡| 国产精品久久久久久久第一福利 | 亚洲福利精品| 欧美精品久久一区| 亚洲精品一区在线观看香蕉| 巨乳诱惑日韩免费av| 午夜视频久久久| 国产一区日韩一区| 裸体女人亚洲精品一区| 亚洲私人影院在线观看| 欧美三级电影一区| 性色av一区二区三区| 亚洲欧美日韩区| 久久久久成人网| 久久久之久亚州精品露出| 亚洲国产欧美另类丝袜| 亚洲国产成人精品视频| 亚洲欧美国产高清va在线播| 国产欧美日韩综合精品二区| 久久久www成人免费无遮挡大片| 小黄鸭精品aⅴ导航网站入口| 精品电影一区| 亚洲欧洲在线一区| 国产精品激情偷乱一区二区∴| 欧美亚洲网站| 久久精品国产99精品国产亚洲性色| 亚洲高清毛片| 一区二区三区精密机械公司 | 亚洲综合好骚| 亚洲高清不卡| 亚洲一区二区影院| 伊人男人综合视频网| 亚洲日本在线视频观看| 国产日韩欧美成人| 久久国产毛片| 另类激情亚洲| 亚洲黄色av一区| 亚洲一区二区三区四区在线观看 | 亚洲午夜激情网站| 玖玖精品视频| 欧美一级二区| 欧美福利小视频| 久久久久久久综合狠狠综合| 欧美久久久久中文字幕| 亚洲一区二区三区精品视频| 亚洲图片欧洲图片av| 一区二区在线观看av| 亚洲第一中文字幕| 国产欧美日韩另类视频免费观看| 亚洲韩国日本中文字幕| 国产色视频一区| 亚洲第一视频| 在线看片成人| 欧美在线国产精品| 午夜视频一区在线观看| 欧美伦理一区二区| 欧美在线视频免费| 久久久亚洲国产天美传媒修理工| 国产精品99久久久久久久女警| 久久久亚洲精品一区二区三区| 欧美中文字幕在线视频| 欧美日韩中字| 99国产精品自拍| 夜夜嗨av一区二区三区网页| 玖玖精品视频| 欧美18av| 亚洲国产精品va在看黑人| 久久久精品一区二区三区| 欧美影片第一页| 午夜精品一区二区三区电影天堂| 午夜精品亚洲一区二区三区嫩草| 欧美日韩岛国| 99re6热只有精品免费观看| 老司机午夜精品视频| 亚洲欧美日韩一区在线| 欧美日韩伦理在线免费| 亚洲国产精品精华液2区45| 影音先锋日韩精品| 久久亚洲春色中文字幕| 欧美激情精品久久久久久大尺度| 99国产精品99久久久久久| 国产精品一区二区三区免费观看| 久久九九国产精品| 亚洲精品中文字幕在线| 欧美一区二区三区日韩视频| 亚洲第一福利社区| 欧美日韩国产首页| 久久www成人_看片免费不卡| 欧美成在线视频| 性视频1819p久久| 亚洲免费高清视频| 国产亚洲人成a一在线v站| 亚洲精品在线二区| 怡红院精品视频| 免费短视频成人日韩| 亚洲国产黄色片| 亚洲人妖在线| 国产视频欧美| 久久亚洲高清| 久久久久久久综合色一本| 欧美激情四色 | 欧美成人精品在线| a4yy欧美一区二区三区| 久久精品人人做人人爽电影蜜月| 亚洲狼人综合| 好吊日精品视频| 国产精品www| 欧美高清视频一区| 久久精品一二三区| 亚洲一区二区在线播放| 女生裸体视频一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在|