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

酸菜豬蹄的程序人生
木下編程屯屯燙燙


作者:<leohe.leohe@gmail.com>

    Linux系統(tǒng)中在應(yīng)用程序運(yùn)行過程中經(jīng)常會遇到程序突然崩潰,提示:Segmentation fault,這是因?yàn)閼?yīng)用程序收到了SIGSEGV信號。這個信號提示當(dāng)進(jìn)程發(fā)生了無效的存儲訪問,當(dāng)接收到這個信號時,缺省動作是:終止w/core。 終止w/core的含義是:在進(jìn)程當(dāng)前目錄生成core文件,并將進(jìn)程的內(nèi)存映象復(fù)制到core文件中,core文件的默認(rèn)名稱就是“core”(這是 Unix類系統(tǒng)的一個由來已久的功能)。
    事實(shí)上,并不是只有SIGSEGV信號產(chǎn)生coredump,還有下面一些信號也產(chǎn)生coredump:SIGABRT(異常終止)、SIGBUS(硬件 故障)、SIGEMT(硬件故障)、SIGFPE(算術(shù)異常)、SIGILL(非法硬件指令)、SIGIOT(硬件故 障),SIGQUIT,SIGSYS(無效系統(tǒng)調(diào)用),SIGTRAP(硬件故障)等。
    在程序的開發(fā)調(diào)試階段(尤其是大型軟件開發(fā)),發(fā)生程序異常崩潰時常規(guī)的調(diào)試方法常常是無比的痛苦:無窮的log中也不見得有什么有意義的信息。好在GDB提供和利用core文件進(jìn)行調(diào)試的途徑,大大方便了這類問題的調(diào)試。

    下面我們通過一個簡單的例子來看看怎么通過GDB來調(diào)試一個違規(guī)訪問內(nèi)存導(dǎo)致的程序崩潰。這里我們順便講講動態(tài)庫的調(diào)試。

/******** mylib.h **********/
#ifndef __MY_LIB_H__
#define __MY_LIB_H__

int add(int x, int y);

#endif // __MY_LIB_H__
/******** end **********/



/******** mylib.c **********/
#include <stdlib.h>
#include "mylib.h"

int add(int x, int y)
{
    char* pc = NULL;
    *pc = 10;

    return x + y;
}
/******** end **********/

/******** main.c **********/

#include <stdio.h>
#include <stdlib.h>

#include "mylib.h"

int main (void)
{
    int ret = -1;
    int a = 10, b = 20;
    ret = add(a, b);

    printf("The result is: %d\n", ret);

    return 0;
}
/******** end **********/

#####################################
# File Name: Makefile
#
#####################################

CC = gcc
LD = gcc

all:
        $(CC) mylib.c -g -I. -fPIC -shared -o libmylib.so
        $(CC) main.c -g -I. -L. -lmylib -o test

clean:
        rm *.so test
#############   END   ###############

    首先將上面的代碼分別存儲到相應(yīng)的目錄,名稱為:mylib.h、mylib.c、main.c、Makefile。

1)編譯測試代碼。注)編譯時的 -g 選項(xiàng)是必須的。
[xxx@yyy]$ make
gcc mylib.c -g -I. -fPIC -shared -o libmylib.so
gcc main.c -g -I. -L. -lmylib -o t

通過ls命令我們可以看到生成了測試程序test.
[xxx@yyy]$ ls
libmylib.so main.c Makefile mylib.c mylib.h test

2)執(zhí)行測試程序
[xxx@yyy]$ ./test
./test: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

這個錯誤表明程序在運(yùn)行階段不能找到相應(yīng)的動態(tài)庫文件,此時需要通過環(huán)境變量 LD_LIBRARY_PATH 來指定運(yùn)行期動態(tài)庫的搜索目錄,我們的動態(tài)庫就在當(dāng)前目錄,如下:

[xxx@yyy]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

3)再次執(zhí)行測試程序
[leo@localhost debug]$ ./test
Segmentation fault
[leo@localhost debug]$ ls
libmylib.so main.c Makefile mylib.c mylib.h test

4)設(shè)置core文件大小
Segmentation fault如期而至,但是卻沒有我們更想見到的core文件!
原來系統(tǒng)在默認(rèn)情況下core文件的大小設(shè)置為0,換句話講也就是不產(chǎn)生core文件。我們可以通過 ulimit 命令來修改core文件的大小,unlimited表示不限制core文件的大小,如下(設(shè)置core文件的大小需要root權(quán)限):
[root@yyy]# ulimit -c unlimited
[root@yyy]# ./test
Segmentation fault (core dumped)
[root@yyy]# ls
core.2890 libmylib.so main.c Makefile mylib.c mylib.h test

5)設(shè)置core文件的格式,輸出路徑
通過下面命令我們還可以指定core文件的命名格式,路徑等(需要root權(quán)限):
[root@yyy]# echo "core_%e_%s" >/proc/sys/kernel/core_pattern
[root@yyy]# ./test
Segmentation fault (core dumped)
[root@yyy]# ls
core.2890 core_test_11.2898 libmylib.so main.c Makefile mylib.c mylib.h test

6)調(diào)試
[root@yyy]# gdb test core.2890
GNU gdb Red Hat Linux (6.5-8.fc6rh)
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 "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
Error while mapping shared library sections:
libmylib.so: Success.
Reading symbols from /home/xxx/tst/libmylib.so...done.
Loaded symbols for libmylib.so
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x00a8969c in ?? ()
(gdb)

鍵入GDB命令 where
(gdb) where
#0 0x001ec44c in ?? ()
#1 0x00000000 in ?? ()

?? ()并不是我們想看到的,之所以這樣,是因?yàn)镚DB不能正確加載我們編寫的動態(tài)庫libmylib.so,我們需要在這里設(shè)置GDB的動態(tài)庫搜索路徑,如下:

(gdb) set solib-search-path .
Reading symbols from /home/xxx/test/tst/libmylib.so...done.
Loaded symbols for /home/xxx/test/tst/libmylib.so
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2

可以看到GDB已經(jīng)加載了libmylib.so,再次鍵入where命令:
(gdb) where
#0 0x001ec44c in add (x=10, y=20) at mylib.c:8
#1 0x0804847c in main () at main.c:12
(gdb)

這次我們期待的結(jié)果出現(xiàn)了,GDB清楚的列出了錯誤出現(xiàn)的位置:mylib.c的第8行,好了,到那里去改code吧!
posted on 2010-11-16 10:40 cooelaf 閱讀(1483) 評論(0)  編輯 收藏 引用 所屬分類: Linux
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线首页| 久久精品亚洲| 欧美国产第一页| 尤妮丝一区二区裸体视频| 久久久爽爽爽美女图片| 欧美日韩一区二区三区在线 | 欧美日韩国产影院| 亚洲激情专区| 99精品欧美一区二区蜜桃免费| 欧美日韩日韩| 亚洲欧美日韩专区| 欧美亚洲一区三区| 亚洲国产精品成人| 亚洲人成7777| 欧美亚韩一区| 久久久噜噜噜久久中文字免| 久久综合九色综合欧美就去吻| 亚洲片区在线| 一本久久青青| 激情五月***国产精品| 欧美福利电影网| 国产精品第一区| 久久综合久久综合久久| 亚洲精品视频中文字幕| 亚洲精品一二三区| 欧美午夜宅男影院在线观看| 国产精品欧美一区喷水 | 国产乱码精品一区二区三区五月婷| 久久久久久亚洲精品中文字幕| 久久婷婷综合激情| 亚洲在线日韩| 久久综合色综合88| 先锋a资源在线看亚洲| 麻豆精品一区二区av白丝在线| 亚洲主播在线播放| 开心色5月久久精品| 午夜精品免费在线| 欧美成年人网| 久久一二三国产| 欧美视频一区二区三区…| 久久综合狠狠综合久久激情| 国产精品日韩一区二区| 亚洲精品偷拍| 亚洲女女做受ⅹxx高潮| 久久天天综合| 欧美一区二区播放| 欧美人在线观看| 久久免费国产精品1| 国产精品theporn| 亚洲国产1区| 激情国产一区| 亚洲免费在线| 午夜久久影院| 欧美日韩在线精品| 91久久精品一区| 亚洲国产精品毛片| 久久精品一区二区| 久久久精品欧美丰满| 国产精品免费观看视频| 亚洲免费激情| 在线综合视频| 欧美日韩国产综合视频在线| 亚洲国产天堂久久综合网| 开心色5月久久精品| 亚洲第一福利视频| 午夜久久资源| 午夜欧美视频| 国产精品网站视频| 99精品国产高清一区二区| 亚洲精选中文字幕| 欧美精品一区二区视频| 亚洲欧洲在线看| 亚洲日本中文字幕免费在线不卡| 免费成人高清| 欧美激情一区在线| 日韩一级在线| 欧美视频不卡中文| 亚洲永久精品大片| 久久激情视频免费观看| 激情久久久久久久| 欧美成人在线免费观看| 亚洲人成免费| 先锋影音久久久| 国产亚洲精品久| 亚洲免费观看视频| 国产精品电影观看| 亚洲欧美日韩专区| 久久视频这里只有精品| 亚洲欧洲三级电影| 久久久99爱| 久久综合影音| 99av国产精品欲麻豆| 欧美日韩一区二区三区在线观看免| 一本久久a久久免费精品不卡| 欧美一级视频免费在线观看| 精品成人乱色一区二区| 欧美激情性爽国产精品17p| 一本久久a久久免费精品不卡| 久久精品国产欧美激情| 在线观看日韩av| 欧美天天影院| 久久色中文字幕| 妖精视频成人观看www| 久久天天躁夜夜躁狠狠躁2022 | 在线视频中文亚洲| 欧美精品啪啪| 亚洲综合欧美日韩| 欧美国产日韩亚洲一区| 亚洲图片欧美一区| 国产精品免费观看在线| 老司机成人网| 亚洲午夜在线观看| 亚洲国产高清在线| 久久精品99国产精品日本| 亚洲日本欧美在线| 国产亚洲一区二区三区在线观看| 欧美成年人视频网站欧美| 久久国产精品久久久久久| 一本综合精品| 狠狠色2019综合网| 亚洲一区二区三区视频| 亚洲国产福利在线| 久久久久久高潮国产精品视| 亚洲午夜精品一区二区三区他趣 | 亚洲黄一区二区三区| 欧美一区二区三区精品电影| 久久丁香综合五月国产三级网站| 蜜桃av一区二区三区| 午夜精品视频在线观看一区二区 | 99精品国产在热久久| 美女爽到呻吟久久久久| 香蕉av777xxx色综合一区| 99亚洲视频| 亚洲黄页一区| 亚洲国产激情| 在线欧美日韩| 在线精品视频一区二区| 国内精品视频在线观看| 国产欧美一级| 国产欧美一区二区精品秋霞影院| 欧美视频一区二区三区| 欧美日韩一区二| 欧美日韩精品免费观看视频完整| 欧美国产日韩亚洲一区| 欧美不卡激情三级在线观看| 美女日韩欧美| 欧美激情a∨在线视频播放| 免费试看一区| 欧美国产大片| 欧美日韩亚洲成人| 欧美日韩在线视频一区二区| 欧美色偷偷大香| 国产精品久久影院| 亚洲综合色激情五月| 久久嫩草精品久久久精品| 久久久精品一区| 久久精品国产清高在天天线| 久久国产欧美日韩精品| 久久久久久9999| 欧美激情在线有限公司| 亚洲精品精选| 这里只有精品丝袜| 亚洲欧美国产视频| 久久久久久亚洲综合影院红桃| 久久嫩草精品久久久久| 欧美黄色aa电影| 国产精品福利av| 国产一区二区三区的电影 | 欧美三级在线视频| 国产精品日韩欧美| 狠狠色2019综合网| 亚洲精品视频一区| 亚洲欧美美女| 蜜乳av另类精品一区二区| 亚洲国产小视频| 亚洲欧美日韩视频二区| 久久久久久噜噜噜久久久精品| 欧美大片在线看免费观看| 欧美私人啪啪vps| 精品999久久久| 在线视频精品| 久久九九精品99国产精品| 最新高清无码专区| 午夜精品免费视频| 欧美成人综合在线| 国产精品视频免费观看| 亚洲国产导航| 久久成人国产精品| 亚洲人成在线影院| 欧美一区二区三区喷汁尤物| 欧美精品久久一区| 国产一区二区三区奇米久涩 | 亚洲欧美日韩一区二区在线 | 亚洲三级电影全部在线观看高清| 亚洲午夜一二三区视频| 欧美成人精品不卡视频在线观看 | 美女被久久久| 国产免费亚洲高清| 中文有码久久| 欧美黄色影院|