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

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

路漫漫,長(zhǎng)修遠(yuǎn),我們不能沒有錢
隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
數(shù)據(jù)加載中……

在C/C++程序里打印調(diào)用棧信息(轉(zhuǎn)載)

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

以下不能windows + mingw下執(zhí)行.  windows下參考 http://code.google.com/p/backtrace-mingw/
我們知道,GDB的backtrace命令可以查看堆棧信息。但很多時(shí)候,GDB根本用不上。比如說(shuō),在線上環(huán)境中可能沒有GDB,即使有,也不太可能讓我們直接在上面調(diào)試。如果能讓程序自己輸出調(diào)用棧,那是最好不過了。本文介紹和調(diào)用椎棧相關(guān)的幾個(gè)函數(shù)。
 
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);
 
以上內(nèi)容源自這幾個(gè)函數(shù)的man手冊(cè)。
 
先簡(jiǎn)單介紹一下這幾個(gè)函數(shù)的功能:
l backtrace:獲取當(dāng)前的調(diào)用棧信息,結(jié)果存儲(chǔ)在buffer中,返回值為棧的深度,參數(shù)size限制棧的最大深度,即最大取size步的棧信息。
l backtrace_symbols:把backtrace獲取的棧信息轉(zhuǎn)化為字符串,以字符指針數(shù)組的形式返回,參數(shù)size限定轉(zhuǎn)換的深度,一般用backtrace調(diào)用的返回值。
l backtrace_symbols_fd:它的功能和backtrace_symbols差不多,只不過它不把轉(zhuǎn)換結(jié)果返回給調(diào)用方,而是寫入fd指定的文件描述符。
Man手冊(cè)里,給出了一個(gè)簡(jiǎn)單的實(shí)例,我們看一下:
 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
 
運(yùn)行:
# ./prog 0
backtrace() returned 6 addresses
./prog() [0x80485a3]
./prog() [0x8048630]
./prog() [0x8048653]
./prog() [0x80486a7]
 
這樣,是輸出了調(diào)用棧,不過只是以十六進(jìn)制輸出函數(shù)地址而已,可讀性很差。仔細(xì)看下man手冊(cè),原來(lái)很簡(jiǎn)單,編譯時(shí)加上個(gè)參數(shù):
 
重新編譯:
# cc -rdynamic  prog.c -o prog
通過gcc手冊(cè),我們可以也解下參數(shù)的說(shuō)明:
-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.
 
再執(zhí)行:
# ./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]
 
這回,可以看到函數(shù)名了。

posted on 2012-12-17 22:12 Khan 閱讀(1647) 評(píng)論(0)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺(tái)開發(fā)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久综合婷婷| 在线一区日本视频| 欧美日本二区| 久久久久久69| 亚洲精品免费网站| 亚洲欧美日韩高清| 亚洲欧洲精品一区| 亚洲欧美成人网| 亚洲免费av观看| 欧美一级欧美一级在线播放| 日韩图片一区| 久久裸体艺术| 久久在线观看视频| 国产精品乱码一区二区三区| 在线一区亚洲| 久久一区二区视频| 欧美一区日本一区韩国一区| 欧美激情四色| 欧美 日韩 国产在线| 欧美性猛交xxxx乱大交蜜桃| 亚洲风情在线资源站| 国产一区二区三区在线免费观看 | 久久精品国产第一区二区三区| 亚洲免费av片| 鲁大师影院一区二区三区| 亚洲综合视频网| 欧美激情小视频| 欧美激情一区二区三区在线| 欧美激情第1页| 久久婷婷国产综合尤物精品| 欧美高清一区二区| 玖玖玖国产精品| 国产精品永久免费视频| 亚洲精品国产精品乱码不99| 在线观看视频一区二区欧美日韩| 欧美亚洲日本一区| 亚洲综合电影| 欧美日韩国产一级片| 蜜桃av噜噜一区| 加勒比av一区二区| 欧美专区日韩视频| 久久影院午夜论| 在线观看视频欧美| 久久亚洲免费| 亚洲盗摄视频| 日韩视频在线一区二区三区| 欧美成人精品一区二区| 亚洲大片在线观看| 9国产精品视频| 欧美日韩精品在线观看| av72成人在线| 亚洲欧美日韩一区在线| 国产精品区二区三区日本| 亚洲在线免费| 久久亚裔精品欧美| 亚洲精品国产视频| 欧美精品久久一区| 中日韩男男gay无套| 性8sex亚洲区入口| 国内精品久久久久影院 日本资源| 久久久精品tv| 欧美国产免费| 亚洲视频1区2区| 国产伦理一区| 久久久综合精品| 亚洲精品美女在线| 亚洲欧美在线aaa| 好吊成人免视频| 美女黄色成人网| 一区二区三区三区在线| 久久国产精品亚洲va麻豆| 伊人婷婷久久| 欧美日韩国产在线| 午夜精品一区二区三区在线| 免费h精品视频在线播放| 亚洲人成小说网站色在线| 欧美日韩一区二区视频在线| 亚洲女同在线| 欧美国产日韩精品| 亚洲欧美日韩国产另类专区| 国产一区二区三区高清| 欧美顶级艳妇交换群宴| 亚洲一区二区少妇| 欧美激情一区二区三区全黄| 亚洲一区二区免费| 伊甸园精品99久久久久久| 欧美日韩一级大片网址| 久久精品女人的天堂av| 亚洲精品少妇30p| 久久久久久成人| 一区二区黄色| 国产精品成人一区二区三区吃奶 | 欧美国产高清| 午夜精品三级视频福利| 亚洲三级免费观看| 另类激情亚洲| 欧美一区免费视频| 亚洲视频视频在线| 永久免费毛片在线播放不卡| 国产精品观看| 欧美韩国日本综合| 久久亚洲精品中文字幕冲田杏梨| 亚洲午夜性刺激影院| 亚洲国产精品成人一区二区 | 亚洲精品欧美激情| 韩国欧美一区| 国产精品国产三级国产专区53 | 日韩亚洲一区二区| 激情久久中文字幕| 国产欧美 在线欧美| 欧美日韩国产天堂| 欧美成人免费网站| 亚洲一卡二卡三卡四卡五卡| 亚洲第一级黄色片| 久久国产精品毛片| 午夜精品久久久久| 亚洲免费视频在线观看| 99这里有精品| 日韩午夜黄色| 日韩视频专区| 国产精品99久久久久久www| 亚洲一区精品视频| 亚洲免费伊人电影在线观看av| 一区二区三区四区国产精品| 亚洲国产精品高清久久久| 在线看片日韩| 亚洲国产精品美女| 亚洲国产你懂的| 亚洲国产裸拍裸体视频在线观看乱了中文| 国模吧视频一区| 国产真实乱偷精品视频免| 国产美女搞久久| 国产婷婷一区二区| 国产综合色产在线精品| 国产一区二区高清| 国产日韩一区二区| 国产亚洲女人久久久久毛片| 国产有码在线一区二区视频| 国产精品一区二区在线观看不卡| 国产精品一区二区三区免费观看| 国产精品夜夜夜一区二区三区尤| 国产伦一区二区三区色一情| 国产伊人精品| 亚洲国产日韩综合一区| 亚洲精品在线视频观看| 中国女人久久久| 欧美亚洲免费高清在线观看| 欧美jizz19性欧美| 亚洲精品中文字幕女同| 亚洲精品久久久蜜桃| 亚洲午夜精品17c| 亚洲免费在线| 久久先锋资源| 欧美日韩国产影片| 国产精品视频久久一区| 欧美日韩一区二区三区视频| 国产欧美一区二区三区久久| 在线成人亚洲| 99国内精品久久久久久久软件| 午夜精品免费视频| 欧美一区二区三区视频免费| 欧美主播一区二区三区| 麻豆精品精华液| 日韩亚洲在线| 久久青青草综合| 欧美日韩在线观看一区二区| 国产一区美女| 一区二区三区回区在观看免费视频| 亚洲欧美视频在线观看| 欧美成人一区在线| 亚洲视频免费在线| 久久综合色婷婷| 国产精品热久久久久夜色精品三区| 伊人男人综合视频网| 亚洲午夜精品17c| 美国十次成人| 久久久久国产精品厨房| 欧美色大人视频| 亚洲国产清纯| 久久久水蜜桃av免费网站| 亚洲精品美女在线观看| 久久久久国产精品午夜一区| 国产人成精品一区二区三| 亚洲视频一二区| 99热精品在线观看| 欧美日一区二区三区在线观看国产免| 亚洲激情第一页| 亚洲国产精品va在看黑人| 麻豆精品一区二区综合av| 亚洲第一中文字幕| 免费在线看成人av| 久久综合给合| 亚洲国产日韩在线| 亚洲电影免费在线观看| 欧美国产日韩一区| 日韩一区二区免费高清| a4yy欧美一区二区三区| 欧美日韩一区二区国产| 亚洲欧美日韩精品久久| 欧美一级二级三级蜜桃|