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

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>
            亚洲清纯自拍| 欧美日韩视频在线一区二区观看视频| 久久久综合精品| 欧美在线视频免费播放| 欧美在线视频一区二区| 久久爱www久久做| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美国产精品v| 亚洲国内自拍| 中国女人久久久| 欧美在线中文字幕| 美国十次了思思久久精品导航| 欧美69wwwcom| 国产精品久久久久免费a∨大胸| 国产欧美另类| 亚洲精品一区二区三区福利| 午夜精品亚洲| 欧美激情一区二区三区成人| 一本色道久久加勒比88综合| 久久国产精品一区二区| 欧美日本亚洲韩国国产| 国产亚洲人成a一在线v站| 亚洲精品国产精品久久清纯直播| 午夜影院日韩| 亚洲国产精品精华液2区45| 亚洲欧美日韩成人| 欧美乱在线观看| 狠狠入ady亚洲精品| 亚洲午夜精品久久久久久浪潮| 久久久99国产精品免费| 夜夜狂射影院欧美极品| 久久综合久久88| 国产日韩精品久久久| 一区二区三区欧美在线观看| 久久综合婷婷| 午夜欧美大片免费观看| 欧美日韩日韩| 99re在线精品| 亚洲国产成人精品女人久久久| 欧美在线亚洲综合一区| 国产目拍亚洲精品99久久精品| 99国产精品久久久| 欧美黄色影院| 亚洲视频1区| 亚洲高清不卡一区| 久久午夜国产精品| 韩国女主播一区| 久久久91精品国产一区二区三区 | 一区二区三区欧美日韩| 男人的天堂亚洲在线| 欧美在线观看网址综合| 国产精品一区二区你懂得| 亚洲欧美不卡| 亚洲在线日韩| 国产精品爽爽爽| 性久久久久久| 欧美亚洲综合在线| 国产日韩在线视频| 欧美中文字幕在线视频| 欧美诱惑福利视频| 激情亚洲网站| 欧美护士18xxxxhd| 欧美极品在线播放| 一本高清dvd不卡在线观看| 亚洲剧情一区二区| 欧美亚男人的天堂| 欧美在线资源| 久久精品国产欧美激情| 亚洲福利视频一区二区| 91久久精品日日躁夜夜躁国产| 欧美va天堂va视频va在线| 亚洲精品偷拍| 亚洲午夜精品久久| 国产专区综合网| 欧美wwwwww| 欧美日韩国产电影| 亚洲欧美日韩一区在线观看| 性做久久久久久| 最新成人在线| 亚洲一区亚洲二区| 亚洲成色精品| 一区二区三区毛片| 加勒比av一区二区| 亚洲精品欧美日韩专区| 国产精品一区二区a| 免费一区二区三区| 国产精品magnet| 久久综合影音| 欧美日韩视频专区在线播放 | 久久这里只有精品视频首页| 噜噜爱69成人精品| 亚洲资源av| 美女国产精品| 销魂美女一区二区三区视频在线| 久久综合九色综合久99| 亚洲在线播放| 久久综合免费视频影院| 亚洲欧美网站| 欧美精品午夜视频| 免费不卡在线观看| 国产精品综合av一区二区国产馆| 欧美国产大片| 久久久www成人免费无遮挡大片| 91久久夜色精品国产网站| 亚洲香蕉视频| 亚洲毛片一区| 欧美亚洲网站| 亚洲视频你懂的| 久久在线免费视频| 久久精品视频在线| 欧美午夜精品久久久久久人妖| 欧美激情第10页| 狠狠色狠狠色综合日日91app| 亚洲手机在线| 国产精品99久久久久久人| 久久影视三级福利片| 欧美在线观看视频在线| 欧美揉bbbbb揉bbbbb| 91久久在线视频| 最近中文字幕mv在线一区二区三区四区| 亚洲免费一在线| 亚洲影院高清在线| 欧美香蕉视频| 一本色道婷婷久久欧美| aa亚洲婷婷| 欧美精品三级日韩久久| 亚洲高清在线观看一区| 亚洲二区精品| 免费成人黄色片| 蘑菇福利视频一区播放| 在线观看日韩av先锋影音电影院| 欧美亚洲视频| 久久男女视频| 1024精品一区二区三区| 久久久久久高潮国产精品视| 久久视频这里只有精品| 黄色成人91| 免费精品99久久国产综合精品| 欧美福利在线| 亚洲美女精品一区| 欧美日韩国产综合视频在线观看 | 美女视频黄免费的久久| 韩曰欧美视频免费观看| 久久精品国产免费看久久精品| 久久蜜桃香蕉精品一区二区三区| 国产专区综合网| 麻豆久久婷婷| 最新国产精品拍自在线播放| 一本色道久久综合亚洲精品按摩| 欧美日韩日本国产亚洲在线| 亚洲视频999| 久久精品综合| 亚洲精品一区二区三| 欧美日韩一区二区三区在线看 | 欧美一区二区视频免费观看| 久久久人人人| 亚洲精品视频在线| 国产精品久久久久久福利一牛影视 | 最近中文字幕日韩精品| 亚洲天天影视| 国产自产在线视频一区| 亚洲美女色禁图| 性欧美xxxx视频在线观看| 在线观看成人av电影| 欧美国产一区二区| 在线视频一区二区| 老司机精品久久| 亚洲网站在线观看| 国语自产偷拍精品视频偷| 欧美精品1区2区3区| 校园春色国产精品| 日韩午夜电影av| 久久亚洲私人国产精品va| 日韩午夜一区| 一区二区三区在线免费播放| 欧美日韩国产片| 久久米奇亚洲| 亚洲欧美精品| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产日韩精品久久久| 欧美1级日本1级| 久久国产精品久久w女人spa| 亚洲欧洲在线观看| 久久午夜电影网| 亚洲欧美日韩精品| 亚洲精品色图| 有坂深雪在线一区| 国产精品一页| 国产精品s色| 欧美日本二区| 欧美成人精品激情在线观看| 亚洲欧美中日韩| 一区二区成人精品| 亚洲精品你懂的| 久久看片网站| 久久疯狂做爰流白浆xx| 亚洲已满18点击进入久久| 日韩视频在线观看免费| 亚洲韩国青草视频| 在线观看日韩国产|