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

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

2010年11月16日

MiniDumpWriteDump是MS DbgHelp.dll 中一個(gè)API, 用于導(dǎo)出當(dāng)前運(yùn)行的程序的Dump. 這個(gè)dll程序系統(tǒng)中就有, 但是很多軟件, 都在自己的安裝目錄下保存了這個(gè).dll的最新的版本.

為了測(cè)試這個(gè)API, 參考網(wǎng)上一些資料, 寫(xiě)了一個(gè)簡(jiǎn)單的C++ 程序. 目的是當(dāng)有異常發(fā)生的時(shí)候, 自動(dòng)生成Dump文件供之后的分析. 有了Dump文件, 我們就可以使用WinDBG等調(diào)試器來(lái)分析異常發(fā)生時(shí)的情況. 其實(shí)這個(gè)功能很多軟件都有, 比如QQ, 魔獸世界, 等等. 它們?cè)诔霈F(xiàn)了異常的時(shí)候會(huì)彈出一個(gè)對(duì)話框, 讓用戶輸入異常發(fā)生時(shí)的情況, 然后把異常的dump文件用email發(fā)回, 供開(kāi)發(fā)者們分析修改bug.

不過(guò)有一點(diǎn), 這里需要程序的調(diào)試符號(hào)文件(pdb文件). 對(duì)于Debug版來(lái)說(shuō), 是生成的, 但是Release版來(lái)說(shuō)默認(rèn)是不生成的. 可以設(shè)置VC的編譯器, 讓它在Release版的時(shí)候也生成調(diào)試信息. 這帶來(lái)一個(gè)新的問(wèn)題, 因?yàn)?pdb里面是保存了源文件的信息的, 為了避免泄密, 可以采用VS中的CVPack工具, 從中去除敏感的信息.

程序需要使用Dbghelp.hDbghelp.lib . 它們可以從MSDN找到.

//最主要的函數(shù), 生成Dump
static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
if (excpInfo == NULL) //如果沒(méi)有傳入異常, 比如是在程序里面調(diào)用的, 生成一個(gè)異常
{
// Generate exception to get proper context in dump
__try
{
OutputDebugString(_T("raising exception\r\n"));
RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
}
__except(DumpMiniDump(hFile, GetExceptionInformation()),
EXCEPTION_CONTINUE_EXECUTION)
{
}
}
else
{
OutputDebugString(_T("writing minidump\r\n"));
MINIDUMP_EXCEPTION_INFORMATION eInfo;
eInfo.ThreadId = GetCurrentThreadId(); //把需要的信息添進(jìn)去
eInfo.ExceptionPointers = excpInfo;
eInfo.ClientPointers = FALSE;

    // 調(diào)用, 生成Dump. 98不支持
// Dump的類(lèi)型是小型的, 節(jié)省空間. 可以參考MSDN生成更詳細(xì)的Dump
.
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
excpInfo ? &eInfo : NULL,
NULL,
NULL);
}
}

下面的是程序部分:

int _tmain(int argc, _TCHAR* argv[])
{
// 創(chuàng)建一個(gè)Dump文件
HANDLE hFile = CreateFile( _T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
int code;
__try
{   
// 把自己實(shí)現(xiàn)的main函數(shù)包裝一下, 放在try .. except 塊中. 這樣出現(xiàn)了異常可以自動(dòng)生成dump
main_wrapper(argc, argv);
}
__except( code=GetExceptionCode(), DumpMiniDump(hFile, GetExceptionInformation() ),       EXCEPTION_EXECUTE_HANDLER ) //出現(xiàn)了異常, 記錄異常的code, 生成dump!!
{
printf("%x\n", code);
wchar_t msg[512];
wsprintf(msg, L"Exception happened. Exception code is %x", code);
MessageBox(NULL, msg, L"Exception", MB_OK); //顯示消息給用戶
}
CloseHandle( hFile ); //關(guān)閉Dump文件
getchar();
return 0;
}

最下面是兩個(gè)測(cè)試的函數(shù), main_wrapper函數(shù)將調(diào)用test1, test1將會(huì)生成一個(gè)異常(非法內(nèi)存寫(xiě))

void test1() {
int *p;
p = (int*)0x100;
*p = 0; //寫(xiě)0x100地址, 這個(gè)是非法的
}

void main_wrapper(int argc, _TCHAR* argv[]) {
test1();
}

運(yùn)行, 異常被捕獲了:

同時(shí), dump文件也生成了:


用WinDBG打開(kāi)Dump文件, 可以清楚的看出異常出現(xiàn)的情況:




從中可以比較清楚的看到異常發(fā)生的情況(Exception code), 異常出現(xiàn)的地址(test1函數(shù), 偏移0x28). 因?yàn)檫@次測(cè)試的是Debug版, 有保存了源代碼的.pdb文件, 所以WinDbg把源代碼也列出來(lái)了. 這樣可以非常容易的發(fā)現(xiàn)問(wèn)題.

============================================

參考:
DbgHelp中的DumpAPI例子: http://www.debuginfo.com/examples/src/effminidumps/MiniDump.cpp
CrashReport: 程序出現(xiàn)異常的時(shí)候顯示發(fā)送錯(cuò)誤的對(duì)話框, 并把Dump文件發(fā)送到指定的地址. http://code.google.com/p/crashrpt/
XCrashReport: 與上面的類(lèi)似的一個(gè)開(kāi)源項(xiàng)目. http://www.codeproject.com/KB/debug/XCrashReportPt1.aspx
posted @ 2010-11-16 10:41 cooelaf 閱讀(2758) | 評(píng)論 (1)編輯 收藏
 


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

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

    下面我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看怎么通過(guò)GDB來(lái)調(diào)試一個(gè)違規(guī)訪問(wèn)內(nèi)存導(dǎo)致的程序崩潰。這里我們順便講講動(dòng)態(tài)庫(kù)的調(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   ###############

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

1)編譯測(cè)試代碼。注)編譯時(shí)的 -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

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

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

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

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

3)再次執(zhí)行測(cè)試程序
[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如期而至,但是卻沒(méi)有我們更想見(jiàn)到的core文件!
原來(lái)系統(tǒng)在默認(rèn)情況下core文件的大小設(shè)置為0,換句話講也就是不產(chǎn)生core文件。我們可以通過(guò) ulimit 命令來(lái)修改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文件的格式,輸出路徑
通過(guò)下面命令我們還可以指定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不能正確加載我們編寫(xiě)的動(dòng)態(tài)庫(kù)libmylib.so,我們需要在這里設(shè)置GDB的動(dòng)態(tài)庫(kù)搜索路徑,如下:

(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清楚的列出了錯(cuò)誤出現(xiàn)的位置:mylib.c的第8行,好了,到那里去改code吧!
posted @ 2010-11-16 10:40 cooelaf 閱讀(1483) | 評(píng)論 (0)編輯 收藏

2008年11月20日

用戶要想確定在所使用的Linux系統(tǒng)上有沒(méi)有加上中文環(huán)境,具體可分為以下兩步來(lái)進(jìn)行。
首先對(duì)于bash,需要在/etc/profile或$HOME/.profile文件里加上下面的語(yǔ)句:
stty cs8 -istrip 
stty pass8

執(zhí)行下面的命令:
#export LANG =C 
#export LC_CTYPE=iso-8859-1

然后,在$HOME/.inputrc里加上以下語(yǔ)句:
set convert -meta off 
set output -meta on

修改之后,用戶不必重新啟動(dòng)系統(tǒng),只需新開(kāi)一個(gè)虛擬終端,或者注銷(xiāo)后再登錄即可生效。

(轉(zhuǎn)載自http://developer.51cto.com/art/200509/3819.htm)

posted @ 2008-11-20 08:49 cooelaf 閱讀(1404) | 評(píng)論 (0)編輯 收藏

2008年8月22日

     摘要: 先簡(jiǎn)要介紹dd的參數(shù),后邊通過(guò)幾個(gè)實(shí)例介紹dd的應(yīng)用,參考了其他網(wǎng)友的資料,在此一并感謝 小菜水平有限文中有什么錯(cuò)誤請(qǐng)大家指正,關(guān)于dd還有什么好的使用方法,可以貼出來(lái),小菜會(huì)及時(shí)更新 dd 是 Linux/UNIX 下的一個(gè)非常有用的命令,作用是用指定大小的塊拷貝一個(gè)文件,并在拷貝的同時(shí)進(jìn)行指定的轉(zhuǎn)換。 1. 命令簡(jiǎn)介 dd&n...  閱讀全文
posted @ 2008-08-22 09:47 cooelaf 閱讀(479) | 評(píng)論 (0)編輯 收藏

2008年1月27日

     摘要: 本文列舉了在windows下禁用輸入法的API。  閱讀全文
posted @ 2008-01-27 16:43 cooelaf 閱讀(1878) | 評(píng)論 (0)編輯 收藏

2007年10月16日

Technorati 標(biāo)簽: , ,

 

修改/etc/inittab文件。將id:5:initdefault: 中的5修改為3,表示不進(jìn)入X界面。

反之亦然。

posted @ 2007-10-16 18:41 cooelaf 閱讀(446) | 評(píng)論 (0)編輯 收藏

2007年10月10日

     摘要: 本文介紹了Fedora下Samba服務(wù)器的配置。  閱讀全文
posted @ 2007-10-10 00:43 cooelaf 閱讀(1342) | 評(píng)論 (5)編輯 收藏

2007年9月27日

     摘要: 本文介紹了多播編程的要點(diǎn),不涉及具體代碼。  閱讀全文
posted @ 2007-09-27 22:29 cooelaf 閱讀(3346) | 評(píng)論 (0)編輯 收藏
 
     摘要: 本文介紹了如何使用Live Writer來(lái)寫(xiě)blog。  閱讀全文
posted @ 2007-09-27 21:09 cooelaf 閱讀(779) | 評(píng)論 (3)編輯 收藏

2006年5月19日

     摘要:   閱讀全文
posted @ 2006-05-19 17:48 cooelaf 閱讀(56216) | 評(píng)論 (14)編輯 收藏
僅列出標(biāo)題  下一頁(yè)
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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国产一区二区三精品乱码| 欧美顶级少妇做爰| 亚洲欧洲精品成人久久奇米网| 国产日韩欧美亚洲一区| 欧美jjzz| 亚洲高清在线| 国产日韩av一区二区| 午夜精品一区二区三区电影天堂 | 久久亚洲精品中文字幕冲田杏梨| 欧美性开放视频| 亚洲免费一区二区| 久久精品国产久精国产爱| 亚洲电影成人| 欧美日韩亚洲一区二区| 亚洲尤物在线视频观看| 亚洲永久免费av| 这里只有精品丝袜| 国产主播精品| 欧美人成在线视频| 欧美一区二区三区四区夜夜大片 | 亚洲欧洲中文日韩久久av乱码| 亚洲综合首页| 亚洲九九精品| 亚洲看片一区| 国产综合久久| 欧美韩日高清| 免费不卡中文字幕视频| 性做久久久久久久免费看| 亚洲精品久久久久久久久久久| 欧美一区二区在线| 麻豆精品一区二区综合av| 久久精品一区蜜桃臀影院| 久久久综合免费视频| 欧美在线一级视频| 久久久久久自在自线| 性欧美18~19sex高清播放| 亚洲手机在线| 久久精品夜夜夜夜久久| 欧美高清视频一区二区| 亚洲最新中文字幕| 亚洲欧洲精品天堂一级| 美女图片一区二区| 亚洲国产天堂网精品网站| 亚洲日本中文字幕免费在线不卡| 亚洲人成艺术| 久久这里只有| 欧美成人免费小视频| 国产精品成人av性教育| 国产欧美另类| 伊人久久亚洲美女图片| 国产一区二区激情| 亚洲另类自拍| 久久―日本道色综合久久| 夜夜精品视频| 亚洲午夜三级在线| 国产精品久久久久9999| 亚洲性感美女99在线| 久久免费99精品久久久久久| 欧美视频官网| 久久国产精品黑丝| 99re亚洲国产精品| 欧美gay视频| 激情综合色综合久久| 另类尿喷潮videofree| 免费观看一级特黄欧美大片| 亚洲免费人成在线视频观看| 国产欧美va欧美va香蕉在| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美国产日韩二区| 亚洲精品麻豆| 久久久久久高潮国产精品视| 99国产精品久久久久久久成人热| 最新日韩精品| 久久精品国产在热久久| 欧美日韩国产综合久久| 一区二区三区日韩欧美| 亚洲免费人成在线视频观看| 国产精品国产三级国产普通话99 | 亚洲系列中文字幕| 欧美国产视频一区二区| 久久精品一区| 美腿丝袜亚洲色图| 欧美一区二区三区视频在线| 在线日韩中文字幕| 亚洲国产一区二区三区在线播| 亚洲午夜电影| 久久久91精品| 欧美影片第一页| 久久精品夜色噜噜亚洲a∨| 亚洲美女在线视频| 欧美一区二区三区视频在线| 亚洲国产欧美在线人成| 亚洲制服少妇| 日韩视频一区二区在线观看| 91久久精品国产91久久性色tv| 久久成人18免费观看| 亚洲成人在线网| 久久福利毛片| 欧美国产视频日韩| 日韩一级黄色片| 久久综合九色综合欧美狠狠| 午夜精品99久久免费| 欧美精品在欧美一区二区少妇| 亚洲美女在线视频| 米奇777超碰欧美日韩亚洲| 久久精品99国产精品| 亚洲二区三区四区| 久久久久国产精品厨房| 久久aⅴ国产欧美74aaa| 国产日韩欧美不卡| 亚洲少妇最新在线视频| 一本久久综合亚洲鲁鲁| 国产日韩欧美日韩| 国产精品99久久久久久久女警| 国产麻豆日韩欧美久久| 亚洲视频中文| 性18欧美另类| 国产精品蜜臀在线观看| 亚洲人成在线免费观看| 亚洲一区二区三区在线观看视频| 欧美国产在线电影| 亚洲美女视频在线免费观看| 欧美bbbxxxxx| 一区二区三区四区五区视频| 午夜精品久久久久久久白皮肤 | 亚洲欧美在线一区| 久久日韩粉嫩一区二区三区| 亚洲精品国产精品乱码不99按摩 | 欧美精品一线| 香港成人在线视频| 亚洲视频第一页| 午夜在线精品| 一区二区在线视频| 国产色综合久久| 国产精品欧美经典| 欧美日韩成人在线观看| 久久频这里精品99香蕉| 久久精品中文字幕一区| 欧美激情欧美狂野欧美精品| 欧美顶级艳妇交换群宴| 久久久久久综合| 香蕉尹人综合在线观看| 亚洲宅男天堂在线观看无病毒| 亚洲第一网站免费视频| 亚洲视频第一页| 9l国产精品久久久久麻豆| 亚洲欧美日本伦理| 99国产精品一区| 欧美在线一区二区| 久久九九热re6这里有精品| 亚洲欧美乱综合| 欧美激情精品久久久久久久变态 | 久久久精品国产免大香伊| 欧美激情日韩| 亚洲一区不卡| 欧美国产亚洲视频| 免费欧美视频| 亚洲美女黄色片| 久久久久国产精品麻豆ai换脸| 久久国产一区| 欧美剧在线免费观看网站| 国产精品少妇自拍| 国产亚洲一区二区精品| 亚洲伦理一区| 免费在线欧美视频| 久久精品一区| 欧美性猛交xxxx乱大交蜜桃 | 亚洲视频一区在线| 99re热这里只有精品免费视频| 久久精品免费观看| 欧美区一区二| 亚洲国产精品一区二区第一页| 伊人久久大香线蕉av超碰演员| 午夜精品三级视频福利| 久久综合电影| 在线亚洲+欧美+日本专区| 欧美不卡三区| 亚洲欧洲在线观看| 一本久道久久久| 欧美成人黄色小视频| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产女人aaa毛片在线| 亚洲欧美激情四射在线日 | 欧美一区二粉嫩精品国产一线天| 欧美电影在线| 国产日韩在线看| 欧美激情成人在线视频| 美女免费视频一区| 亚洲视频免费在线观看| 欧美一级网站| 亚洲特级片在线| 夜夜爽99久久国产综合精品女不卡| 欧美涩涩网站| 亚洲女女做受ⅹxx高潮| 欧美高清不卡在线| 欧美日韩精品在线视频| 久久阴道视频| 欧美国产亚洲视频|