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

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 閱讀(1647) 評論(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>
            一本一本久久a久久精品综合妖精| 欧美日本韩国一区二区三区| 一区二区三区日韩欧美| 欧美在线观看视频一区二区| 一本大道av伊人久久综合| 久久精品五月| 久久精品盗摄| 欧美视频精品在线观看| 欧美福利视频| 伊人久久大香线| 欧美一区二区三区久久精品茉莉花| 亚洲天堂av综合网| 欧美精品 日韩| 91久久久一线二线三线品牌| 精品成人一区二区三区四区| 性色一区二区| 欧美在线高清视频| 国产日韩综合一区二区性色av| 亚洲视频在线观看三级| 亚洲一二三区视频在线观看| 欧美巨乳在线| 亚洲精品综合久久中文字幕| 亚洲日本va午夜在线电影| 久久久久久久综合| 久久精品国产精品亚洲综合| 国产亚洲成av人片在线观看桃| 亚洲男人天堂2024| 欧美在线视频网站| 国产亚洲一区二区在线观看| 午夜欧美理论片| 久久国产精品99久久久久久老狼| 国产日本欧美一区二区三区在线 | 久久久777| 久久一日本道色综合久久| 影音先锋亚洲精品| 免费不卡在线观看| 亚洲国内精品| 亚洲在线成人| 国产日韩成人精品| 久久在线精品| 亚洲欧洲中文日韩久久av乱码| 一区二区三区成人精品| 国产精品国产三级国产普通话三级 | 久久都是精品| 在线免费一区三区| 欧美日产国产成人免费图片| 在线一区欧美| 久久久美女艺术照精彩视频福利播放| 韩国一区二区三区美女美女秀| 久久久久久久综合日本| 亚洲人午夜精品免费| 羞羞视频在线观看欧美| 有坂深雪在线一区| 欧美日韩高清不卡| 亚洲欧美自拍偷拍| 亚洲国产精品久久久| 香蕉成人啪国产精品视频综合网| 国产一区亚洲| 欧美美女视频| 久久久www| 一区二区冒白浆视频| 久久视频国产精品免费视频在线| 亚洲精品美女久久7777777| 国产精品高潮呻吟久久| 久久综合激情| 亚洲一区二区三区午夜| 亚洲第一色中文字幕| 午夜精品久久99蜜桃的功能介绍| 国内偷自视频区视频综合| 亚洲在线国产日韩欧美| 久久综合激情| 一级成人国产| 国产亚洲美州欧州综合国| 先锋a资源在线看亚洲| 久久婷婷av| 日韩视频在线观看免费| 国产精品免费一区二区三区在线观看| 欧美在线你懂的| 亚洲人永久免费| 久久成人一区| 一区二区国产在线观看| 国产欧美一区二区白浆黑人| 久久久国产视频91| 亚洲性xxxx| 亚洲成在线观看| 久久aⅴ国产紧身牛仔裤| 亚洲欧洲精品一区二区三区波多野1战4| 欧美精品久久久久久久久老牛影院| 亚洲精品视频二区| 蜜臀91精品一区二区三区| 亚洲在线观看视频| 91久久久亚洲精品| 国产精品国产馆在线真实露脸| 裸体一区二区| 欧美一区二区三区在线观看视频| 亚洲毛片在线看| 欧美黄色免费网站| 欧美亚洲在线| 午夜久久久久久久久久一区二区| 亚洲人体大胆视频| 韩国一区二区在线观看| 国产精品高精视频免费| 欧美精品日韩一本| 久久久久久尹人网香蕉| 性xx色xx综合久久久xx| 亚洲欧美在线一区二区| 99精品国产99久久久久久福利| 欧美顶级少妇做爰| 欧美午夜免费| 亚洲激精日韩激精欧美精品| 国产精品一区二区久久久久| 欧美日韩激情小视频| 免费高清在线视频一区·| 午夜日韩在线观看| 亚洲视频精选| 在线综合+亚洲+欧美中文字幕| 亚洲国产第一| 亚洲电影在线看| 亚洲国产精品久久久| 欧美 日韩 国产 一区| 久久久久久欧美| 久久久999精品免费| 久久精品理论片| 久久久久久尹人网香蕉| 久久久精品一区二区三区| 久久精品理论片| 午夜精品久久久久99热蜜桃导演| 久久精品国产99精品国产亚洲性色| 亚洲欧美日韩精品一区二区| 亚洲欧美国产制服动漫| 欧美一区2区三区4区公司二百| 亚洲欧美精品在线观看| 午夜精品影院| 久久久五月天| 老司机67194精品线观看| 欧美1区3d| 亚洲电影第1页| 亚洲另类在线一区| 亚洲一区999| 午夜精品久久久久久久男人的天堂| 一本不卡影院| 亚洲人成网站在线观看播放| 亚洲美女在线观看| 午夜精品视频| 美女黄毛**国产精品啪啪| 欧美大香线蕉线伊人久久国产精品| 欧美成人午夜免费视在线看片| 欧美国产一区二区| 欧美天天影院| 国产一区二区三区在线观看网站| 在线观看一区视频| 一区二区三区成人精品| 一区二区三区久久| 久久亚洲精品中文字幕冲田杏梨| 欧美.com| 亚洲一区二区不卡免费| 久久精品最新地址| 欧美日韩亚洲高清| 国产精品亚洲аv天堂网| 亚洲精品国产精品久久清纯直播| 亚洲免费一在线| 美日韩精品免费观看视频| 亚洲精品在线观看免费| 亚洲欧美色婷婷| 欧美大秀在线观看| 在线看日韩欧美| 亚洲综合久久久久| 欧美成人一区二区三区在线观看| 99国产精品视频免费观看一公开 | 玖玖玖免费嫩草在线影院一区| 亚洲激情一区| 欧美一区二区高清在线观看| 欧美高清在线视频| 国产一区二区| 亚洲在线观看| 亚洲大片av| 一区二区三区日韩精品视频| 久久综合给合久久狠狠狠97色69| 国产乱理伦片在线观看夜一区| 亚洲国产成人久久| 欧美在线三区| 一本一本久久a久久精品牛牛影视| 久久久高清一区二区三区| 国产精品久久一卡二卡| 国产精品免费视频xxxx| 亚洲视频在线看| 亚洲高清在线精品| 欧美在线观看网址综合| 国产精品美女黄网| 99成人免费视频| 亚洲精品美女久久久久| 麻豆精品在线观看| 在线免费观看欧美| 久久一二三国产| 亚洲一区二区三区在线| 欧美日韩国产一区二区| 亚洲精华国产欧美| 你懂的网址国产 欧美| 久久国产视频网站| 国产精品久久久久毛片大屁完整版|