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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

1: 段錯誤產生的原因

簡而言之,產生段錯誤就是訪問了錯誤的內存段,一般是你沒有權限,或者根本就不存在對應的物理內存,
尤其常見的是訪問0地址.一旦一個程序發生了越界訪問,系統就采取內存保護措施,并給那個程序發送
SIGSEGV信號,程序接到那個信號后就知道segmentation fault出現了。

想對”段錯誤”有更詳細的了解可以去閱讀“Linux下的段錯誤產生的原因及調試方法” 這篇文章,本文的
內容基本是從那文章里提取出來的。

2: SIGSEGV信號處理函數

程序接到SIGSEGV信號后的缺省處理是退出程序,這也是為什么總是看到程序打印一個“segmentation fault”
信息后就消失了。我們可以使用 signal(SIGSEGV, &your_function);函數來接管SIGSEGV信號的處理,讓
程序在發生段錯誤后,自動調用我們準備好的函數,從而在那個函數里來獲取當前函數調用棧。

3: libc的Backtraces函數

在GDB里,可以簡單的使用bt命令就可以獲取函數調用棧,但如何通過代碼獲取當前函數調用棧?
這里我們可以通過libc庫提供的Backtraces系列函數

A backtrace is a list of the function calls that are currently active in a
thread. The usual way to inspect a backtrace of a program is to use an
external debugger such as gdb. However, sometimes it is useful to
obtain a backtrace programmatically from within a program, e.g., for the
purposes of logging or diagnostics.
?
The header file execinfo.h declares three functions that obtain and
manipulate backtraces of the current thread.

4: 實現步驟

4.1 在你的工程中添加如下代碼:

														#include <execinfo.h>
														#include <stdio.h>
														#include <stdlib.h>
														#include <signal.h>
?
void dump(int signo){void*array[30];
    size_t size;char**strings;
    size_t i;
?
    size = backtrace (array,30);
    strings = backtrace_symbols (array, size);
?
    fprintf (stderr,"Obtained %zd stack frames.nm", size);
?
    for(i =0; i < size; i++)
        fprintf (stderr,"%sn", strings[i]);
?
    free (strings);
?
    exit(0);}
?
Debug_Printf_FrameInfos(){
    signal(SIGSEGV,&dump);}

4.2 在mian函數開始位置處調用 Debug_Printf_FrameInfos() 函數
4.3 在編譯程序時 加上 -g 選項

5 定位出錯函數地址實例

這里以 test.c 為例,來查找出錯函數地址

														#include <execinfo.h> 
														#include <stdio.h>
														#include <stdlib.h>
														#include <signal.h>
?
void dump(int signo){void*array[30];
    size_t size;char**strings;
    size_t i;
?
    size = backtrace (array,30);
    strings = backtrace_symbols (array, size);
?
    fprintf (stderr,"Obtained %zd stack frames.nm", size);
?
    for(i =0; i <= size; i++)
        fprintf (stderr,"%s\n", strings[i]);
?
    free (strings);
    exit(0);}
?
Debug_Printf_FrameInfos(){
    signal(SIGSEGV, dump);}
?
void func_c(){*((volatilechar*)0x0)=0x999;}void func_b(){
    func_c();}void func_a(){
    func_b();}int main(){
    Debug_Printf_FrameInfos();
    func_a();return0;}

該例程調用序列為:
main() -> func_a() -> func_b() -> func_c() -> 出錯

5.1編譯程序:

# gcc -g test.c -o test

注:選項 -rdynamic 可用來通知鏈接器將所有符號添加到動態符號表中,如果你的鏈接器支持-rdynamic的話,
建議將其加上,即
# gcc -rdynamic -g test.c -o test

5.2 運行 test程序:

														#  ./test
Obtained 7 stack frames.nm./a.out [0x80484e3][0xb7f70420]
./a.out [0x804859d]
./a.out [0x80485a7]
./a.out [0x80485c4]/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e1e450]
./a.out [0x8048461]
Segmentation fault

如果編譯似加了-rdynamic選項 的話,將打印如下信息

														# ./test 
Obtained 7 stack frames.nm./test(dump+0x1f)[0x80487c3][0xb7fbb420]
./test(func_b+0x8)[0x804887d]
./test(func_a+0x8)[0x8048887]
./test(main+0x1b)[0x80488a4]/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e69450]
./test[0x8048741]

打印信息比沒加-rdynamic的程序多出了一個函數名稱+偏移地址..(func_b+0×8)

5.3 使用objdump獲取程序所有符合

objdump -d ./test > tmp.txt

5.4 分析和查找

在tmp.txt 中查找0×80485ad的地址,你會發現如下信息:
08048595 :
8048595: 55 push %ebp
8048596: 89 e5 mov %esp,%ebp
8048598: e8 eb ff ff ff call 8048588
804859d: 5d pop %ebp
804859e: c3

其中 804859d 是調用( call 8048588 )c函數后的地址,雖然并沒有直接定位到C函數,
通過匯編代碼,基本可以推出是在C函數出現問題了。(pop指令不會導致段錯誤的)

本文最早發布在 我的CSDN blog上。

本文地址:
http://www.kgdb.info/linuxdev/backtrace_without_gdb/
版權所有 ? 轉載時必須以鏈接形式注明作者和原始出處!

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美影视一区| 欧美激情91| 麻豆国产va免费精品高清在线| 亚洲日本欧美天堂| 久久日韩粉嫩一区二区三区| 亚洲男女毛片无遮挡| 亚洲激情精品| 媚黑女一区二区| 亚洲电影av在线| 免费影视亚洲| 免费看的黄色欧美网站| 黄网站色欧美视频| 久久嫩草精品久久久精品| 欧美在线短视频| 狠狠色狠狠色综合日日五| 久久天天躁狠狠躁夜夜爽蜜月| 香蕉久久夜色精品国产使用方法| 国产精品v欧美精品v日本精品动漫 | 亚洲欧洲一区二区三区| 久久综合九色九九| 狠狠入ady亚洲精品经典电影| 久久精品国产综合精品| 欧美一区二区精品在线| 黑人极品videos精品欧美裸| 免播放器亚洲一区| 欧美成人久久| 亚洲男人av电影| 久久经典综合| 亚洲精品看片| 亚洲午夜一区二区| 国产在线观看91精品一区| 两个人的视频www国产精品| 老司机精品视频一区二区三区| 亚洲欧洲在线播放| 亚洲天堂激情| 一色屋精品视频免费看| 亚洲国产婷婷| 国产精品永久入口久久久| 久久精品色图| 欧美精品久久久久久久久久| 校园激情久久| 香蕉久久国产| 久久先锋影音| 欧美精品videossex性护士| 免费观看成人网| 亚洲日本欧美| 欧美一级大片在线免费观看| 精品动漫3d一区二区三区免费版| 亚洲人成网在线播放| 欧美色网一区二区| 蜜臀av性久久久久蜜臀aⅴ| 欧美连裤袜在线视频| 久久国产精品一区二区三区四区| 欧美成年人视频| 欧美呦呦网站| 欧美日韩裸体免费视频| 久色成人在线| 欧美午夜不卡在线观看免费| 久久一区二区精品| 国产精品v欧美精品v日韩| 久久在线视频在线| 国产精品久久久久久久久搜平片 | 亚洲国产精品嫩草影院| 国产精品爱久久久久久久| 久久综合久久综合这里只有精品| 欧美人与禽猛交乱配| 久久亚洲精品一区| 国产精品久久综合| 亚洲国产精品久久久久秋霞影院 | 亚洲中午字幕| 女女同性精品视频| 玖玖在线精品| 国产亚洲欧美日韩日本| 一区二区三区视频在线播放| 91久久久久久国产精品| 久久久www成人免费精品| 欧美在线精品免播放器视频| 欧美视频一区二区三区四区| 欧美成人黑人xx视频免费观看| 国产精品夜夜夜| 一区二区欧美亚洲| 中文国产一区| 欧美日韩一区在线观看视频| 亚洲国产毛片完整版| 一区二区视频欧美| 久久久久久综合| 亚洲综合色婷婷| 一区二区欧美日韩| 欧美成人午夜77777| 欧美国产三区| 亚洲看片免费| 欧美日韩国产不卡| 亚洲人成网站影音先锋播放| 亚洲人成毛片在线播放女女| 久热精品视频在线观看| 噜噜噜91成人网| 亚洲高清在线精品| 欧美国产丝袜视频| 亚洲国产欧美不卡在线观看| 一本色道久久综合亚洲精品小说| 欧美日韩国产三区| 亚洲六月丁香色婷婷综合久久| 亚洲黄色成人| 欧美不卡在线视频| 亚洲韩日在线| 亚洲免费视频在线观看| 欧美日韩999| 亚洲一区中文字幕在线观看| 欧美在线观看视频一区二区| 久久久久久久久岛国免费| 亚洲成人资源网| 欧美激情1区2区| 亚洲与欧洲av电影| 久久久久久久久伊人| 在线成人国产| 欧美日韩另类综合| 香港久久久电影| 欧美成人精品一区二区| 99re6这里只有精品| 国产精品成人一区二区| 欧美一区二区三区免费观看视频| 欧美第十八页| 亚洲一区在线观看视频| 国产在线不卡视频| 欧美交受高潮1| 欧美一级黄色网| 亚洲激情亚洲| 午夜天堂精品久久久久| 亚洲国产va精品久久久不卡综合| 欧美日韩一区二区三区免费| 亚洲嫩草精品久久| 亚洲国产精品久久久久秋霞不卡| 亚洲在线一区| 亚洲国产另类久久精品| 国产精品v日韩精品| 久久久久久久综合色一本| 日韩视频免费| 美国三级日本三级久久99| 国产精品99久久久久久久久| 国产在线观看91精品一区| 欧美日韩在线一区二区| 久久全国免费视频| 一本色道久久综合亚洲二区三区| 国产日韩欧美一区二区| 欧美日韩国产二区| 久久亚洲高清| 翔田千里一区二区| 日韩小视频在线观看专区| 免费中文日韩| 久久精品国产在热久久| 亚洲一区二区免费| 亚洲精品一二区| 一区二区三区在线免费视频 | 亚洲一区成人| 亚洲国产福利在线| 国内精品久久久久久久影视麻豆 | 国产精品视频99| 欧美激情视频网站| 媚黑女一区二区| 久久青草久久| 欧美尤物一区| 亚洲欧美日韩精品久久| 99re视频这里只有精品| 亚洲第一视频网站| 久热综合在线亚洲精品| 久久久www成人免费无遮挡大片| 亚洲视频久久| 99re6热只有精品免费观看| 亚洲美女av黄| 一区二区欧美日韩| 久久久中精品2020中文| 午夜精品99久久免费| 一区二区三区四区五区精品| 亚洲人成艺术| 亚洲日本成人| 亚洲精品乱码久久久久久蜜桃91| 亚洲高清一区二| 亚洲国产精品一区二区第一页 | 欧美日韩国产一级| 欧美成人一二三| 欧美高清自拍一区| 欧美精品一区二区久久婷婷| 欧美激情1区2区3区| 欧美激情第五页| 欧美日韩另类一区| 国产精品国产三级国产普通话蜜臀 | 亚洲一区二区成人| 一区二区三区视频在线| 欧美四级伦理在线| 亚洲午夜视频在线| 欧美一级在线播放| 免费观看亚洲视频大全| 欧美电影在线观看| 欧美调教视频| 韩国免费一区| 日韩视频中文字幕| 小黄鸭视频精品导航| 猛男gaygay欧美视频| 亚洲国产日韩综合一区| 日韩视频免费大全中文字幕|