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

posts - 297,  comments - 15,  trackbacks - 0
我們在用C/C++語言寫程序的時(shí)侯,內(nèi)存管理的絕大部分工作都是需要我們來做的。實(shí)際上,內(nèi)存管理是一個(gè)比較繁瑣的工作,無論你多高明,經(jīng)驗(yàn)多豐富,難 免會(huì)在此處犯些小錯(cuò)誤,而通常這些錯(cuò)誤又是那么的淺顯而易于消除。但是手工“除蟲”(debug),往往是效率低下且讓人厭煩的,本文將就"段錯(cuò)誤"這個(gè) 內(nèi)存訪問越界的錯(cuò)誤談?wù)勅绾慰焖俣ㄎ贿@些"段錯(cuò)誤"的語句。
下面將就以下的一個(gè)存在段錯(cuò)誤的程序介紹幾種調(diào)試方法:
     1  dummy_function (void)
     2  {
     3          unsigned char *ptr = 0x00;
     4          *ptr = 0x00;
     5  }
     6
     7  int main (void)
     8  {
     9          dummy_function ();
    10
    11          return 0;
    12  }
作為一個(gè)熟練的C/C++程序員,以上代碼的bug應(yīng)該是很清楚的,因?yàn)樗鼑L試操作地址為0的內(nèi)存區(qū)域,而這個(gè)內(nèi)存區(qū)域通常是不可訪問的禁區(qū),當(dāng)然就會(huì)出錯(cuò)了。我們嘗試編譯運(yùn)行它:
xiaosuo@gentux test $ ./a.out
段錯(cuò)誤
果然不出所料,它出錯(cuò)并退出了。
1.利用gdb逐步查找段錯(cuò)誤:
這種方法也是被大眾所熟知并廣泛采用的方法,首先我們需要一個(gè)帶有調(diào)試信息的可執(zhí)行程序,所以我們加上“-g -rdynamic"的參數(shù)進(jìn)行編譯,然后用gdb調(diào)試運(yùn)行這個(gè)新編譯的程序,具體步驟如下:
xiaosuo@gentux test $ gcc -g -rdynamic d.c
xiaosuo@gentux test $ gdb ./a.out
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) r
Starting program: /home/xiaosuo/test/a.out

Program received signal SIGSEGV, Segmentation fault.
0x08048524 in dummy_function () at d.c:4
4               *ptr = 0x00;
(gdb)                      
哦?!好像不用一步步調(diào)試我們就找到了出錯(cuò)位置d.c文件的第4行,其實(shí)就是如此的簡單。
從這里我們還發(fā)現(xiàn)進(jìn)程是由于收到了SIGSEGV信號而結(jié)束的。通過進(jìn)一步的查閱文檔(man 7 signal),我們知道SIGSEGV默認(rèn)handler的動(dòng)作是打印”段錯(cuò)誤"的出錯(cuò)信息,并產(chǎn)生Core文件,由此我們又產(chǎn)生了方法二。
2.分析Core文件:
Core文件是什么呢?
The  default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the process's memory  at the time of termination.  A list of the signals which cause a process to dump core can be found in signal(7).
以 上資料摘自man page(man 5 core)。不過奇怪了,我的系統(tǒng)上并沒有找到core文件。后來,憶起為了漸少系統(tǒng)上的拉圾文件的數(shù)量(本人有些潔癖,這也是我喜歡Gentoo的原因 之一),禁止了core文件的生成,查看了以下果真如此,將系統(tǒng)的core文件的大小限制在512K大小,再試:
xiaosuo@gentux test $ ulimit -c
0
xiaosuo@gentux test $ ulimit -c 1000
xiaosuo@gentux test $ ulimit -c
1000
xiaosuo@gentux test $ ./a.out
段錯(cuò)誤 (core dumped)
xiaosuo@gentux test $ ls
a.out  core  d.c  f.c  g.c  pango.c  test_iconv.c  test_regex.c
core文件終于產(chǎn)生了,用gdb調(diào)試一下看看吧:
xiaosuo@gentux test $ gdb ./a.out core
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".


warning: Can't read pathname for load map: 輸入/輸出錯(cuò)誤.
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x08048524 in dummy_function () at d.c:4
4               *ptr = 0x00;
哇,好歷害,還是一步就定位到了錯(cuò)誤所在地,佩服一下Linux/Unix系統(tǒng)的此類設(shè)計(jì)。
接著考慮下去,以前用windows系統(tǒng)下的ie的時(shí)侯,有時(shí)打開某些網(wǎng)頁,會(huì)出現(xiàn)“運(yùn)行時(shí)錯(cuò)誤”,這個(gè)時(shí)侯如果恰好你的機(jī)器上又裝有windows的編譯器的話,他會(huì)彈出來一個(gè)對話框,問你是否進(jìn)行調(diào)試,如果你選擇是,編譯器將被打開,并進(jìn)入調(diào)試狀態(tài),開始調(diào)試。
Linux下如何做到這些呢?我的大腦飛速地旋轉(zhuǎn)著,有了,讓它在SIGSEGV的handler中調(diào)用gdb,于是第三個(gè)方法又誕生了:
3.段錯(cuò)誤時(shí)啟動(dòng)調(diào)試:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void dump(int signo)
{
        char buf[1024];
        char cmd[1024];
        FILE *fh;

        snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
        if(!(fh = fopen(buf, "r")))
                exit(0);
        if(!fgets(buf, sizeof(buf), fh))
                exit(0);
        fclose(fh);
        if(buf[strlen(buf) - 1] == '\n')
                buf[strlen(buf) - 1] = '\0';
        snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid());
        system(cmd);

        exit(0);
}

        void
dummy_function (void)
{
        unsigned char *ptr = 0x00;
        *ptr = 0x00;
}

        int
main (void)
{
        signal(SIGSEGV, &dump);
        dummy_function ();

        return 0;
}
編譯運(yùn)行效果如下:
xiaosuo@gentux test $ gcc -g -rdynamic f.c
xiaosuo@gentux test $ ./a.out
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

Attaching to program: /home/xiaosuo/test/a.out, process 9563
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7ee4b53 in waitpid () from /lib/libc.so.6
#2  0xb7e925c9 in strtold_l () from /lib/libc.so.6
#3  0x08048830 in dump (signo=11) at f.c:22
#4  <signal handler called>
#5  0x0804884c in dummy_function () at f.c:31
#6  0x08048886 in main () at f.c:38
怎么樣?是不是依舊很酷?
以上方法都是在系統(tǒng)上有g(shù)db的前提下進(jìn)行的,如果沒有呢?其實(shí)glibc為我們提供了此類能夠dump棧內(nèi)容的函數(shù)簇,詳見/usr/include/execinfo.h(這些函數(shù)都沒有提供man page,難怪我們找不到),另外你也可以通過gnu的手冊進(jìn)行學(xué)習(xí)。
4.利用backtrace和objdump進(jìn)行分析:
重寫的代碼如下:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

/* A dummy function to make the backtrace more interesting. */
        void
dummy_function (void)
{
        unsigned char *ptr = 0x00;
        *ptr = 0x00;
}

void dump(int signo)
{
        void *array[10];
        size_t size;
        char **strings;
        size_t i;

        size = backtrace (array, 10);
        strings = backtrace_symbols (array, size);

        printf ("Obtained %zd stack frames.\n", size);

        for (i = 0; i < size; i++)
                printf ("%s\n", strings[i]);

        free (strings);

        exit(0);
}

        int
main (void)
{
        signal(SIGSEGV, &dump);
        dummy_function ();

        return 0;
}
編譯運(yùn)行結(jié)果如下:
xiaosuo@gentux test $ gcc -g -rdynamic g.c
xiaosuo@gentux test $ ./a.out
Obtained 5 stack frames.
./a.out(dump+0x19) [0x80486c2]
[0xffffe420]
./a.out(main+0x35) [0x804876f]
/lib/libc.so.6(__libc_start_main+0xe6) [0xb7e02866]
./a.out [0x8048601]
這次你可能有些失望,似乎沒能給出足夠的信息來標(biāo)示錯(cuò)誤,不急,先看看能分析出來什么吧,用objdump反匯編程序,找到地址0x804876f對應(yīng)的代碼位置:
xiaosuo@gentux test $ objdump -d a.out

 8048765:       e8 02 fe ff ff          call   804856c <signal@plt>
 804876a:       e8 25 ff ff ff          call   8048694 <dummy_function>
 804876f:       b8 00 00 00 00          mov    $0x0,%eax
 8048774:       c9                      leave
我們還是找到了在哪個(gè)函數(shù)(dummy_function)中出錯(cuò)的,信息已然不是很完整,不過有總比沒有好的啊!
后記:
本文給出了分析"段錯(cuò)誤"的幾種方法,不要認(rèn)為這是與孔乙己先生的"回"字四種寫法一樣的哦,因?yàn)槊糠N方法都有其自身的適用范圍和適用環(huán)境,請酌情使用,或遵醫(yī)囑。
from:
http://www.cublog.cn/u/5251/showart.php?id=173718
posted on 2010-08-21 19:06 chatler 閱讀(342) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久精品美女| 亚洲欧美日韩一区二区在线| 久久久无码精品亚洲日韩按摩| 美女视频黄免费的久久| 99在线精品观看| 久久精品最新地址| 欧美日韩亚洲一区二区三区在线 | 麻豆精品91| 日韩视频免费观看| 久久乐国产精品| 欧美视频二区| 亚洲电影一级黄| 久久成人综合网| 久久久久国产精品一区三寸| 亚洲精品影院| 久久久一区二区三区| 国产精品久久久久久av下载红粉| 伊人久久大香线| 欧美一区二区三区四区高清 | 美女成人午夜| 亚洲午夜精品久久久久久app| 久久久久在线| 亚洲福利视频二区| 一本久道久久综合中文字幕| 久久国产精品毛片| 久久婷婷亚洲| 国产精品网站视频| 亚洲最新视频在线| 久热精品视频在线观看| 亚洲综合激情| 欧美日韩中文字幕日韩欧美| 亚洲国产三级在线| 欧美一区二区免费| 欧美激情偷拍| 国产欧美精品在线播放| 99这里只有久久精品视频| 久久综合网络一区二区| 先锋影音网一区二区| 欧美日韩第一区日日骚| 宅男精品视频| 欧美视频在线观看免费网址| 国产日韩在线看| 午夜精品电影| 亚洲午夜精品网| 国产精品成人va在线观看| 亚洲精品免费在线| 亚洲国产经典视频| 欧美亚洲一区二区在线| 国产美女精品在线| 亚洲欧美日韩一区二区三区在线观看 | 亚洲男同1069视频| 艳女tv在线观看国产一区| 欧美激情一区二区三区在线| 亚洲日本在线视频观看| 亚洲黄色小视频| 欧美日韩情趣电影| 一区二区免费在线观看| 一本一本久久a久久精品综合麻豆| 欧美精品啪啪| 亚洲在线免费观看| 欧美永久精品| 亚洲国产精品久久久久秋霞影院 | 99精品黄色片免费大全| 91久久黄色| 国产精品久久7| 香港久久久电影| 久久久久久尹人网香蕉| 亚洲精品欧美一区二区三区| 亚洲大片在线| 欧美精品性视频| 欧美在线视频日韩| 久久综合给合久久狠狠狠97色69| 免费成人高清在线视频| 男女激情久久| 国产精品扒开腿做爽爽爽软件| 亚洲影音一区| 久久狠狠亚洲综合| 99精品国产在热久久婷婷| 99国产精品视频免费观看一公开| 国产精品国产三级国产普通话蜜臀| 欧美一区二区高清| 久久久精品日韩| 亚洲电影在线| 一区二区三区在线免费播放| 久久久91精品| 欧美激情一二区| 欧美一区二区在线观看| 免费在线看成人av| 亚洲自拍偷拍麻豆| 老牛影视一区二区三区| 亚洲综合久久久久| 久久久99免费视频| 精品不卡一区二区三区| 欧美在线日韩在线| 亚洲系列中文字幕| 国产精品久久久久aaaa| 91久久精品国产91久久| 国产在线成人| 亚洲黄色三级| 国产日韩精品在线| 欧美性感一类影片在线播放| 久久久天天操| 国产精品久久久久久久久免费樱桃 | 黄色另类av| 亚洲午夜视频在线| 日韩视频精品在线| 狂野欧美激情性xxxx| 久久精品国产亚洲aⅴ| 欧美日韩在线播| 亚洲日本中文字幕区| 亚洲欧洲在线视频| 久久成人这里只有精品| 欧美一区二区三区四区在线| 欧美日韩一区二区三区免费| 欧美激情在线播放| 亚洲高清不卡在线| 久久久久久久久久久成人| 久久久国产亚洲精品| 国产精自产拍久久久久久| 这里只有视频精品| 亚洲一区二区三区高清不卡| 欧美久久久久久久久| 亚洲欧洲在线播放| 亚洲免费福利视频| 欧美三级不卡| 亚洲视频在线播放| 欧美影院在线| 国产一区二区三区网站| 久久久精品五月天| 牛夜精品久久久久久久99黑人| 激情五月***国产精品| 久久久高清一区二区三区| 另类尿喷潮videofree| 亚洲国产欧美一区二区三区丁香婷| 久久综合狠狠| 99精品99久久久久久宅男| 亚洲黄色小视频| 亚洲人成在线观看网站高清| 在线亚洲一区二区| 欧美一区二区女人| 久久久久久欧美| 亚洲日本欧美| 欧美视频在线观看| 午夜精品视频在线观看| 久久亚洲春色中文字幕| 亚洲高清免费在线| 欧美日韩一区二区视频在线观看| 日韩午夜三级在线| 欧美在线91| 亚洲精品视频在线观看免费| 国产精品不卡在线| 欧美在线观看天堂一区二区三区| 欧美韩日一区二区三区| 一区二区成人精品| 国产精品久久久久久久久| 久久中文字幕一区二区三区| 99视频一区二区三区| 久久婷婷蜜乳一本欲蜜臀| 亚洲人精品午夜在线观看| 国产精品区一区二区三区| 久久久人人人| 亚洲欧美日韩电影| 亚洲国产综合在线| 欧美成人中文| 久久九九精品99国产精品| 亚洲欧美日韩第一区| 久久久一区二区| 一区二区欧美日韩视频| 国产啪精品视频| 欧美日韩极品在线观看一区| 久久精品在线视频| 亚洲综合三区| 日韩视频一区二区| 蜜桃精品久久久久久久免费影院| 亚洲无线一线二线三线区别av| 欧美视频免费在线观看| 欧美电影美腿模特1979在线看| 性伦欧美刺激片在线观看| 亚洲精品久久久蜜桃| 嫩模写真一区二区三区三州| 久久国内精品视频| 亚洲在线视频免费观看| 亚洲国产精品99久久久久久久久| 国产在线高清精品|