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

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

MiniDumpWriteDump是MS DbgHelp.dll 中一個API, 用于導出當前運行的程序的Dump. 這個dll程序系統中就有, 但是很多軟件, 都在自己的安裝目錄下保存了這個.dll的最新的版本.

為了測試這個API, 參考網上一些資料, 寫了一個簡單的C++ 程序. 目的是當有異常發生的時候, 自動生成Dump文件供之后的分析. 有了Dump文件, 我們就可以使用WinDBG等調試器來分析異常發生時的情況. 其實這個功能很多軟件都有, 比如QQ, 魔獸世界, 等等. 它們在出現了異常的時候會彈出一個對話框, 讓用戶輸入異常發生時的情況, 然后把異常的dump文件用email發回, 供開發者們分析修改bug.

不過有一點, 這里需要程序的調試符號文件(pdb文件). 對于Debug版來說, 是生成的, 但是Release版來說默認是不生成的. 可以設置VC的編譯器, 讓它在Release版的時候也生成調試信息. 這帶來一個新的問題, 因為.pdb里面是保存了源文件的信息的, 為了避免泄密, 可以采用VS中的CVPack工具, 從中去除敏感的信息.

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

//最主要的函數, 生成Dump
static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
if (excpInfo == NULL) //如果沒有傳入異常, 比如是在程序里面調用的, 生成一個異常
{
// 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(); //把需要的信息添進去
eInfo.ExceptionPointers = excpInfo;
eInfo.ClientPointers = FALSE;

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

下面的是程序部分:

int _tmain(int argc, _TCHAR* argv[])
{
// 創建一個Dump文件
HANDLE hFile = CreateFile( _T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
int code;
__try
{   
// 把自己實現的main函數包裝一下, 放在try .. except 塊中. 這樣出現了異常可以自動生成dump
main_wrapper(argc, argv);
}
__except( code=GetExceptionCode(), DumpMiniDump(hFile, GetExceptionInformation() ),       EXCEPTION_EXECUTE_HANDLER ) //出現了異常, 記錄異常的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 ); //關閉Dump文件
getchar();
return 0;
}

最下面是兩個測試的函數, main_wrapper函數將調用test1, test1將會生成一個異常(非法內存寫)

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

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

運行, 異常被捕獲了:

同時, dump文件也生成了:


用WinDBG打開Dump文件, 可以清楚的看出異常出現的情況:




從中可以比較清楚的看到異常發生的情況(Exception code), 異常出現的地址(test1函數, 偏移0x28). 因為這次測試的是Debug版, 有保存了源代碼的.pdb文件, 所以WinDbg把源代碼也列出來了. 這樣可以非常容易的發現問題.

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

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


作者:<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 @ 2010-11-16 10:40 cooelaf 閱讀(1483) | 評論 (0)編輯 收藏
 
用戶要想確定在所使用的Linux系統上有沒有加上中文環境,具體可分為以下兩步來進行。
首先對于bash,需要在/etc/profile或$HOME/.profile文件里加上下面的語句:
stty cs8 -istrip 
stty pass8

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

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

修改之后,用戶不必重新啟動系統,只需新開一個虛擬終端,或者注銷后再登錄即可生效。

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

posted @ 2008-11-20 08:49 cooelaf 閱讀(1404) | 評論 (0)編輯 收藏
 
     摘要: 先簡要介紹dd的參數,后邊通過幾個實例介紹dd的應用,參考了其他網友的資料,在此一并感謝 小菜水平有限文中有什么錯誤請大家指正,關于dd還有什么好的使用方法,可以貼出來,小菜會及時更新 dd 是 Linux/UNIX 下的一個非常有用的命令,作用是用指定大小的塊拷貝一個文件,并在拷貝的同時進行指定的轉換。 1. 命令簡介 dd&n...  閱讀全文
posted @ 2008-08-22 09:47 cooelaf 閱讀(479) | 評論 (0)編輯 收藏
 
     摘要: 本文列舉了在windows下禁用輸入法的API。  閱讀全文
posted @ 2008-01-27 16:43 cooelaf 閱讀(1878) | 評論 (0)編輯 收藏
 

Technorati 標簽: , ,

 

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

反之亦然。

posted @ 2007-10-16 18:41 cooelaf 閱讀(446) | 評論 (0)編輯 收藏
 
     摘要: 本文介紹了Fedora下Samba服務器的配置。  閱讀全文
posted @ 2007-10-10 00:43 cooelaf 閱讀(1342) | 評論 (5)編輯 收藏
 
     摘要: 本文介紹了多播編程的要點,不涉及具體代碼。  閱讀全文
posted @ 2007-09-27 22:29 cooelaf 閱讀(3346) | 評論 (0)編輯 收藏
 
     摘要: 本文介紹了如何使用Live Writer來寫blog。  閱讀全文
posted @ 2007-09-27 21:09 cooelaf 閱讀(779) | 評論 (3)編輯 收藏
 
     摘要:   閱讀全文
posted @ 2006-05-19 17:48 cooelaf 閱讀(56218) | 評論 (14)編輯 收藏
僅列出標題
共2頁: 1 2 
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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视频精品免费观看| 亚洲视频国产视频| 久久久久久国产精品mv| 欧美成人黑人xx视频免费观看| 蜜乳av另类精品一区二区| 欧美成人激情在线| 国产精品家庭影院| 一区二区三区在线高清| 亚洲理伦在线| 欧美一区二区视频在线观看2020| 久久亚洲精品欧美| 日韩视频在线一区二区三区| 一区二区三区四区五区精品| 久久av一区二区三区漫画| 久久久伊人欧美| 欧美午夜www高清视频| 黄色亚洲免费| 亚洲一级在线| 久久免费视频在线观看| 亚洲国产高清一区| 亚洲精品视频免费观看| 亚洲欧美中文另类| 欧美日韩第一区| 国内成人精品一区| 宅男噜噜噜66国产日韩在线观看| 午夜一区不卡| 亚洲日本久久| 欧美亚洲在线| 国产精品久久7| 亚洲国产欧美一区二区三区久久 | 久久久久久久久伊人| 欧美多人爱爱视频网站| 亚洲视频网在线直播| 欧美激情一区二区三区在线视频| 国产精品热久久久久夜色精品三区| 亚洲人成在线免费观看| 老司机精品福利视频| 香蕉成人伊视频在线观看| 欧美激情综合五月色丁香小说| 一区二区在线观看视频| 久久免费国产精品| 欧美伊人久久久久久久久影院| 欧美深夜福利| 国产精品久久婷婷六月丁香| 亚洲第一区色| 欧美在线观看天堂一区二区三区 | 国产在线一区二区三区四区| 欧美日韩一区二区免费在线观看 | 欧美一区二区精品久久911| 亚洲国产日韩综合一区| 老色批av在线精品| 亚洲第一精品影视| 欧美国产一区二区三区激情无套| 久久久精品国产一区二区三区 | 亚洲欧美网站| 国产嫩草一区二区三区在线观看| 在线一区二区视频| 亚洲精品中文在线| 欧美另类综合| 日韩亚洲欧美高清| 亚洲毛片一区| 欧美日韩麻豆| 亚洲一区图片| 亚洲欧美日韩在线高清直播| 国产日韩一区二区三区在线| 久久久一二三| 免费亚洲电影在线| 在线一区二区三区做爰视频网站| 亚洲深夜av| 黄色成人av网| 亚洲人成亚洲人成在线观看| 欧美三日本三级少妇三99| 亚洲欧美三级伦理| 久久久综合香蕉尹人综合网| 亚洲人成小说网站色在线| 一区二区电影免费在线观看| 国产视频在线观看一区二区三区| 嫩草伊人久久精品少妇av杨幂| 欧美本精品男人aⅴ天堂| 亚洲免费观看| 午夜久久久久久久久久一区二区| 影音先锋久久| 亚洲另类一区二区| 国产麻豆视频精品| 欧美波霸影院| 国产精品拍天天在线| 久久理论片午夜琪琪电影网| 欧美成人中文字幕在线| 欧美一级在线亚洲天堂| 久久久噜噜噜久久狠狠50岁| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美日韩区| 一区二区日韩伦理片| 久久久久久高潮国产精品视| 亚洲女同同性videoxma| 久久夜色精品国产欧美乱| 亚洲欧美另类综合偷拍| 亚洲一区区二区| 久久这里只精品最新地址| 欧美护士18xxxxhd| 久久成人一区| 欧美日韩专区在线| 欧美成人一品| 国产精品综合不卡av| 亚洲国产日韩欧美在线动漫| 国产精品一区2区| 亚洲精选国产| 亚洲国产经典视频| 欧美一区免费视频| 欧美在线网址| 欧美午夜精品电影| 亚洲精品视频一区| 日韩视频一区二区| 免费观看30秒视频久久| 久久色在线播放| 国产欧美一区二区精品仙草咪| 亚洲人成人77777线观看| 激情成人综合网| 性欧美长视频| 欧美一区二区视频在线观看| 国产精品av久久久久久麻豆网| 亚洲茄子视频| 日韩视频第一页| 欧美激情第三页| 亚洲区一区二区三区| 亚洲激情视频在线播放| 老司机免费视频一区二区| 麻豆精品国产91久久久久久| 国内自拍亚洲| 久久资源av| 欧美高清在线一区二区| 1024国产精品| 欧美不卡一卡二卡免费版| 亚洲电影欧美电影有声小说| 亚洲欧洲日夜超级视频| 欧美承认网站| 99精品视频免费观看| 亚洲一区二区三区乱码aⅴ| 国产精品成人aaaaa网站 | 亚洲电影视频在线| 亚洲毛片网站| 国产精品扒开腿做爽爽爽视频| 一本色道久久综合一区| 亚洲欧美激情四射在线日| 国产九九精品| 久久尤物视频| 日韩午夜av在线| 欧美综合77777色婷婷| 国产一区二区中文| 麻豆精品视频在线观看| 欧美激情 亚洲a∨综合| 一区二区免费看| 国产精品国产三级国产aⅴ浪潮 | 久久av一区| 亚洲第一久久影院| 精品成人一区| 欧美视频精品在线观看| 午夜免费日韩视频| 欧美激情日韩| 性欧美1819sex性高清| 在线观看国产欧美| 欧美性开放视频| 久久久噜噜噜久久中文字免| 亚洲欧美网站| 亚洲欧美韩国| 女女同性女同一区二区三区91| 日韩午夜三级在线| 国产一区二区三区观看| 欧美精品电影在线| 欧美一区二区三区视频免费播放| 亚洲福利一区| 久久久精品国产免费观看同学| 亚洲精品一区中文| 国产午夜精品全部视频播放| 欧美国产日韩在线观看| 午夜久久一区| 一区二区三区偷拍| 亚洲第一主播视频| 久久久噜噜噜久噜久久| 亚洲小说欧美另类婷婷| 亚洲国内欧美| 亚洲第一精品影视| 国产一级精品aaaaa看| 欧美午夜精品| 欧美日韩精品不卡| 男女激情久久| 久久久精品久久久久| 亚洲欧美日韩一区二区三区在线| 亚洲精品一区二区三区樱花| 欧美激情2020午夜免费观看| 久久视频一区二区| 久久久精品国产一区二区三区|