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

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


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

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

    下面我們通過一個簡單的例子來看看怎么通過GDB來調試一個違規訪問內存導致的程序崩潰。這里我們順便講講動態庫的調試。

/******** 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   ###############

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

1)編譯測試代碼。注)編譯時的 -g 選項是必須的。
[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)執行測試程序
[xxx@yyy]$ ./test
./test: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

這個錯誤表明程序在運行階段不能找到相應的動態庫文件,此時需要通過環境變量 LD_LIBRARY_PATH 來指定運行期動態庫的搜索目錄,我們的動態庫就在當前目錄,如下:

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

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

4)設置core文件大小
Segmentation fault如期而至,但是卻沒有我們更想見到的core文件!
原來系統在默認情況下core文件的大小設置為0,換句話講也就是不產生core文件。我們可以通過 ulimit 命令來修改core文件的大小,unlimited表示不限制core文件的大小,如下(設置core文件的大小需要root權限):
[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)設置core文件的格式,輸出路徑
通過下面命令我們還可以指定core文件的命名格式,路徑等(需要root權限):
[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)調試
[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 ?? ()

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

(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已經加載了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)

這次我們期待的結果出現了,GDB清楚的列出了錯誤出現的位置: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>
            久久久精品一区| 欧美三级在线视频| 欧美激情精品久久久久久蜜臀| 国产日韩欧美在线播放不卡| 日韩一级视频免费观看在线| 欧美国产亚洲视频| 亚洲在线观看视频网站| av不卡在线| 91久久久久久| 久久嫩草精品久久久久| 猫咪成人在线观看| 欧美国产欧美综合| 亚洲日韩欧美视频| 亚洲精品国产精品久久清纯直播| 蜜桃av噜噜一区| 亚洲区欧美区| 亚洲精品中文字幕有码专区| 欧美精品一区二区三区蜜桃 | 国产精品h在线观看| 中文在线资源观看网站视频免费不卡 | 亚洲欧洲精品一区二区三区| 亚洲高清视频在线观看| 欧美日韩精品一区二区在线播放| 中文精品视频| 午夜久久久久久久久久一区二区| 韩国亚洲精品| 亚洲电影免费观看高清完整版在线| 美玉足脚交一区二区三区图片| 亚洲国产日韩美| 亚洲免费观看在线观看| 国产精品一区免费观看| 老**午夜毛片一区二区三区| 欧美高清影院| 午夜精品久久久久久久久久久久| 亚洲综合色视频| 在线观看视频日韩| 亚洲免费观看在线观看| 国产一区二区三区网站| 亚洲国产99| 国产精品一区二区三区四区五区| 免费高清在线一区| 欧美午夜在线| 欧美jizz19hd性欧美| 欧美日韩中文字幕在线| 久久久人人人| 欧美日韩亚洲综合| 蜜桃久久av一区| 国产精品sss| 欧美91视频| 国产精品网站在线播放| 欧美黄网免费在线观看| 国产精品天美传媒入口| 亚洲国产日韩一级| 国产主播一区二区| 9国产精品视频| 亚洲高清视频一区| 亚洲欧美区自拍先锋| 亚洲精品一级| 久久久久久免费| 欧美在线一二三| 欧美三级视频在线播放| 欧美 日韩 国产在线| 国产伦精品一区二区三区免费 | 亚洲男人的天堂在线| 麻豆成人综合网| 羞羞色国产精品| 欧美精品在线观看一区二区| 久久久人人人| 国产精品爽爽ⅴa在线观看| 亚洲国产一区二区三区a毛片| 国产一区二区精品久久91| 亚洲私人影吧| 中国成人亚色综合网站| 欧美风情在线观看| 欧美国产成人精品| 一区二区三区在线免费播放| 午夜影院日韩| 欧美在线播放一区| 国产精品日韩| 在线亚洲自拍| 亚洲自拍偷拍福利| 欧美日韩在线免费视频| 日韩视频精品在线| 一区二区高清| 欧美日韩一级片在线观看| 亚洲精品免费电影| 一区二区三区**美女毛片| 欧美激情视频一区二区三区免费 | 国产色产综合产在线视频| 宅男噜噜噜66国产日韩在线观看| 99这里只有久久精品视频| 欧美另类视频| aa日韩免费精品视频一| 在线亚洲免费| 国产精品国产a级| 亚洲夜间福利| 久久国产欧美精品| 怡红院精品视频| 在线观看视频亚洲| 欧美日韩在线精品| 亚洲二区视频在线| 亚洲成人自拍视频| 久久性色av| 女主播福利一区| 在线观看中文字幕亚洲| 久久精品久久综合| 欧美1区免费| 亚洲人成在线影院| 欧美视频中文一区二区三区在线观看 | 性欧美xxxx视频在线观看| 久久视频在线看| 亚洲国产日韩欧美一区二区三区| 国产精品久久九九| 国产女人aaa级久久久级| 99精品免费网| 亚洲欧美一区二区三区久久 | 欧美一级片一区| 亚洲伦理在线观看| 亚洲综合欧美| 国产在线观看精品一区二区三区 | 欧美激情1区2区| 在线一区亚洲| 久久综合九色综合欧美就去吻 | 中文在线一区| 久久久久久婷| 国产精品99久久久久久久久久久久 | 久久精品免费观看| 亚洲九九九在线观看| 欧美在线观看一二区| 亚洲电影欧美电影有声小说| 欧美视频成人| 久久综合久久美利坚合众国| 一本久久青青| 欧美jjzz| 欧美有码在线观看视频| 亚洲理论电影网| 国内成人精品2018免费看 | 亚洲精品专区| 国色天香一区二区| 国产精品久久久久久久7电影| 蜜月aⅴ免费一区二区三区| 亚洲一区二区三区免费观看| 欧美成人免费在线观看| 欧美在线在线| 亚洲永久字幕| 日韩视频免费在线观看| 激情综合在线| 国产精品自拍小视频| 欧美日韩第一区日日骚| 久久综合一区二区| 91久久久久久| 欧美激情一区二区三区高清视频 | 久久国产免费| 国产欧美91| 欧美在线播放视频| 欧美一级免费视频| 原创国产精品91| 日韩视频一区二区| 国产综合18久久久久久| 亚洲韩日在线| 在线观看三级视频欧美| 亚洲欧美综合国产精品一区| 亚洲国产日本| 国产日韩在线看| 性感少妇一区| 亚洲欧美日韩国产综合| 亚洲视频观看| 一区二区三区精密机械公司| 亚洲电影第1页| 欧美成年网站| 欧美成人官网二区| 日韩视频专区| 亚洲日本成人在线观看| 麻豆精品网站| 久久久91精品国产| 亚洲欧美欧美一区二区三区| 一本色道久久综合| 久久亚洲一区二区| 久久精品夜色噜噜亚洲a∨| 欧美激情片在线观看| 亚洲小视频在线| 亚洲黄页视频免费观看| 亚洲一区尤物| 欧美成人r级一区二区三区| 国产精品免费看片| 亚洲欧洲日产国产综合网| 亚洲欧美日韩国产综合精品二区| 久久综合电影| 亚洲无限乱码一二三四麻| 老司机精品久久| 国产麻豆精品视频| 一级成人国产| 欧美成人有码| 性一交一乱一区二区洋洋av| 欧美大片一区| 在线观看国产欧美| 久久激情久久| 中文av字幕一区| 欧美精品一区二区三区久久久竹菊| 国外成人在线视频网站|