调试Release程序--Dump文件方式

调试Release程序--Dump文件方式
调试Release程序--Dump文件方式

在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了。因为release版本来就少了很多调试信息,更何况一般都是发布出去由用户使用,crash 的现场很难保留和重现。目前有一些方法可以解决:崩溃地址+ MAP文件;MAP 文件;SetUnhandledExceptionFilter + Minidump。本文重点解决Minidump方式。

一、Minidump文件生成

1、Minidump概念

minidump(小存储器转储)可以理解为一个dump文件,里面记录了能够帮助调试crash的最小有用信息。实际上,如果你在系统属性-> 高级-> 启动和故障恢复-> 设置-> 写入调试信息中选择“小内存转储(64 KB)”的话,当系统意外停止时都会在C:\Windows\Minidump\路径下生成一个.dmp后缀的文件,这个文件就是minidump文件,只不过这个是内核态的minidump。

我们要生成的是用户态的minidump,文件中包含了程序运行的模块信息、线程信息、堆栈调用信息等。而且为了符合其mini的特性,dump文件是压缩过的。

2、生成minidump文件

通过drwtsn32、NTSD、CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。根据MiniDumpWriteDump接口,完全可以程序自动生成Dump文件。

3、自动生成Minidump文件

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

生成dump文件类(minidump.h)

#pragma once

#include

#include

#include

#pragma comment(lib, "dbghelp.lib")

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)

{

if(pModuleName == 0)

{

return FALSE;

}

WCHAR szFileName[_MAX_FNAME] = L"";

_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);

if(wcsicmp(szFileName, L"ntdll") == 0)

return TRUE;

return FALSE;

}

inline BOOL CALLBACK MiniDumpCallback(PVOID

pParam,

const PMINIDUMP_CALLBACK_INPUT pInput,

PMINIDUMP_CALLBACK_OUTPUT

pOutput)

{

if(pInput == 0 || pOutput == 0)

return FALSE;

switch(pInput->CallbackType)

{

case ModuleCallback:

if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)

if(!IsDataSectionNeeded(pInput->Module.FullPath))

pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

case IncludeModuleCallback:

case IncludeThreadCallback:

case ThreadCallback:

case ThreadExCallback:

return TRUE;

default:;

}

return FALSE;

}

//创建Dump文件

inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName) {

HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))

{

MINIDUMP_EXCEPTION_INFORMATION mdei;

mdei.ThreadId = GetCurrentThreadId();

mdei.ExceptionPointers = pep;

mdei.ClientPointers = FALSE;

MINIDUMP_CALLBACK_INFORMATION mci;

mci.CallbackRoutine =

(MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;

mci.CallbackParam = 0;

MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)0x0000ffff;

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);

CloseHandle(hFile);

}

}

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI

MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)

{

return NULL;

}

BOOL PreventSetUnhandledExceptionFilter()

{

HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));

if (hKernel32 == NULL)

return FALSE;

void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");

if(pOrgEntry == NULL)

return FALSE;

unsigned char newJump[ 100 ];

DWORD dwOrgEntryAddr = (DWORD) pOrgEntry;

dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far

void *pNewFunc = &MyDummySetUnhandledExceptionFilter;

DWORD dwNewEntryAddr = (DWORD) pNewFunc;

DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;

newJump[ 0 ] = 0xE9; // JMP absolute

memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));

SIZE_T bytesWritten;

BOOL bRet= WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);

return bRet;

}

LONG WINAPI UnhandledExceptionFilterEx(struct_EXCEPTION_POINTERS

*pException)

{

TCHAR szMbsFile[MAX_PATH] = { 0 };

::GetModuleFileName(NULL, szMbsFile, MAX_PATH);

TCHAR* pFind = _tcsrchr(szMbsFile, '\\');

if(pFind)

{

*(pFind+1) = 0;

_tcscat(szMbsFile, _T("CreateMiniDump.dmp"));

CreateMiniDump(pException,szMbsFile);

}

// TODO: MiniDumpWriteDump

FatalAppExit(-1, _T("Fatal Error"));

return EXCEPTION_CONTINUE_SEARCH;

}

//运行异常处理

void RunCrashHandler()

{

SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);

PreventSetUnhandledExceptionFilter();

}

//测试实现文件

// 一个有函数调用的类

//

class CrashTest

{

public:

void Test()

{

Crash();

}

private:

void Crash()

{

// 除零,人为的使程序崩溃

//

int i = 13;

int j = 0;

int m = i / j;

strcpy(NULL,"adfadfg");

}

};

int_tmain(int argc, _TCHAR* argv[])

{

//设置异常处理函数

RunCrashHandler();

CrashTest test;

test.Test();

getchar();

return 0;

}

注意事项

1、需要配置debug选项,在C/C++选项→常规→调试信息格式(设置为程序数据库(/Zi));在连接器选项—>调试→生成调试信息(设置为是);C/C++选项→优化→禁用。(参见下图)

2、可执行文件(exe)必须找到dbghelp.dll,才能生成Dump文件。这个DLL可以从调试工具包中找到。

3、*.exe、*.pdb、*.dump、dbghelp.dll 这四个文件需要放在同一目录下才好调试,双击dump 文件时,就可以自动关联到出错代码位置。

4、为了获取更多更深入的调试信息,需要把程序优化开关设置成禁用。

5、当异常代码定位成功以后,如果无法阻止异常的产生,可以用__try 结构包装异常代码,__try 和try 不同,前者可以捕获非法指针产生的异常。

__try {

// 会异常的函数

}

__except( EXCEPTION_EXECUTE_HANDLER ){

// 异常处理

}

二、调试Minidump文件

1、双击minidump文件(*.dmp)。默认会启动vs2008。

2、菜单工具→选项→调试→符号,增加PDB文件路径。(若minidump文件与pdb文件在同一目录,跳过此步)

3、若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:https://www.360docs.net/doc/7819007530.html,/download/symbols(如果本地已存储过微软基础库的pdb,跳过此步)

4、在界面下方“将符号从服务器缓存到此目录”选择本地存储这些符号(Symbols)的路径。

设置代码路径:打开dmp工程,右键进入解决方案的属性

在这里输入源程序的代码路径。注:一定是sln所在的路径,而不是vcproj的路径!

F5调试,定位到崩溃时源代码对应的位置,还原崩溃现场。

注:请把每次生成的exe(或dll)和pdp以及对应的工程代码文件单独存放,以便于定位错误位置。

C程序调试步骤to初学者

调试程序一般应经过以下几个步骤: 1、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多数错误。而这一步骤往往容易被人忽视。有人总希望把一切推给计算机系统去做,但这样就会多占用机器时间,作为一个程序人员应当养成严谨的科学作风,每一步都要严格把关,不把问题留给后面的程序。 为了更有效地进行人工检查,所编的程序应注意力求做到以下几点: (1)应当采用结构化程序方法编程,以增加可读性;(2)尽可能多加注释,以帮助理解每段程序的作用;(3)在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。这样既易于阅读也便于调试,各函数之间除用参数传递数据这一渠道以外,数据间尽量少出现耦合关系,便于分别检查和处理。 2、在人工检查无误后,才可以上机调试。通过上机发现错误称动态检查。在编译时给出语法错误的信息,可以根据提示的信息具体找出程序中出错之处并改正之。 应当注意的是有时提示的出错并不是真正出错的行,如果在提示出错的行上找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多各种错误互有关联,因止要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。如果系统提示的出错信息多,应当从上到下一一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息;有的是少了“}”或多了“}”有的是书写语句时忘记写“;”或是全角的“;”了,只要加上一个变量定义,或填加“};”就所有错误都消除了。 3、在改正语法错误后,程序经过连接就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。 有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以得出容易判断正确与否的结果。可以在计算的输出结果的程序地方加入一段输出到屏幕窗口的程序,利用屏幕窗口可以方便看到结果的,很直观。例如,if语句有两个分支,有可能在流程经过其中一个分支时结果正确,而经过其它一个分支时结果不对等。必须考虑周全。 事实上,当程序复杂时很难把所有的可能方案全部都试到,选择典型的情况作试验即可。 4、运行结果不对,大多属于逻辑错误。对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法: (1)将程序与流程图仔细对照,如果流程图是正确的话,程序写错了,是很容易发现的。例如,复合语句忘记写花括弧,只要一对照流程图就能很快发现。 (2)如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf 函数语句,输出有关变量的值,往下检查。直到找到在哪一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就可能发现错误所在。 (3)也可以用“条件编译”命令进行程序调试(在程序调试阶段,若干printf函数语句就要进行编译并执行。当调试完毕,这些语句不要再编译了,也不再被执行了)。这种方法可以不必一一去printf函数语句,以提高效率。 5、如果在程序中没有发现问题,就要检查流程图有无错误,即算法有无问题,如有则改正

AIX 里面dump文件系统扩充

在errpt中出现E87EF1BE的dump不够的报错 在errpt中出现 E87EF1BE 0926082807 P O dumpcheck The largest dump device is too small. 信息.断定为存放dump文件的lg_dumplv容量不够.一般推荐的dump device 值大小为sysdumpdev –e 估计值的1.5 倍。 需要扩容.扩容步骤如下: 1.查看lg_dumplv大小的估计值 #sysdumpdev -e 0453-041 Estimated dump size in bytes: 1287651328 即1.2G 2.现在lg_dumplv大小 #lslv lg_dumplv 其中PP SIZE: 256 megabyte(s) PPs: 4 经计算,现在容量为1G.需要扩容0.2G 3.查看lg_dumplv所在的vg的容量是否够用 #lsvg rootvg 其中PP SIZE: 256 megabyte(s) TOTAL PPs: 1092 (279552 megabytes) FREE PPs: 826 (211456 megabytes) 经计算,vg剩余容量为206.5G,因为根盘做了镜像.故,可用剩余容量为103G左右.因pp size为256m,故扩容2pps,即0.5G(其实扩1个pp也可以.2个放心点.) 4.扩容操作 extendlv lg_dumplv 2 5.检查当前lg_dumplv的大小. #lslv lg_dumplv 其中PP SIZE: 256 megabyte(s) PPs: 6 即,现在容量为1.5G. 6.使用dumpcheck命令查看,是否还出现errpt信息

修复更新grub2系统引导

修复更新grub2系统引导 一.修复 如果重装系统或者引导系统崩溃无法进入系统开机引导项从而无法进入以装系统,以Ubuntu Grub2引导为例,详细写一下如何修复之前的系统引导。 (以下说明均以Ubuntu系统为例,其他系统大同小异) 1.放入系统安装盘或这插入刻录好的系统安装U盘,进入系统安装选项,选择试用选项! 2.选择适用之后,进入Ubuntu图形界面,打开终端。 3.选择Ubuntu安装磁盘,如果不确定具体在哪个磁盘,可以用命令查看一下 [plain] sudo fdisk -l 4.挂载Ubuntu系统安装磁盘(我的是在第8磁盘,故为sda8) [plain] sudo mount /dev/sda8 /mnt 5.开始恢复grub2系统引导 [plain] sudo grub-install --root-directory=/mnt/dev/sda 6.执行命令之后,如果没有报错,则恢复成功,重启即可。 二.更新 恢复之后是之前的系统引导界面,如果新安装的系统没有在界面上显示,那么可以进入Ubuntu系统,进行grub2更新。

打开终端,输入 [plain] sudo update-grub2 成功的话,将会出现更新后找到的磁盘上所有系统引导的记录。(以我自己的为例) [plain] hugo@hugo-HP:~$ sudo update-grub2 [sudo] password for hugo: Generating grub.cfg ... Found linux image: /boot/vmlinuz-3.5.0-26-generic Found initrd image: /boot/initrd.img-3.5.0-26-generic Found linux image: /boot/vmlinuz-3.5.0-25-generic Found initrd image: /boot/initrd.img-3.5.0-25-generic Found linux image: /boot/vmlinuz-3.5.0-17-generic Found initrd image: /boot/initrd.img-3.5.0-17-generic Found memtest86+ image: /boot/memtest86+.bin Found Windows 8 (loader) on /dev/sda1 Found CentOS release 6.4 (Final) on /dev/sda3 Found Mac OS X on /dev/sda9 done 之后重启即可。 update-grub这个是Ubuntu专用的吧,其它发行版不一定有,通用的是:sudo grub-mkconfig -o /boot/grub/grub.cfg

软件项目集成开发流程及文档

软件项目集成开发 一、项目组织架构 A 项目经理 负责分析、设计和协调工作。随时监控各开发人员的工作,包括内容是否与要求发生偏差,进度是否滞后等等,同时给每个开发人员明确的任务书。 在项目周期内项目经理最好不要更换。大项目需要配备专门的系统分析师和系统设计师。 B 开发人员 熟悉针对软件开发的编程工具,并具有丰富的编程经验,负责完成不同层与模块的编程工作。 开发人员数量视系统模块数量和开发难度而定。 C 业务需求人员 熟悉业务工作流程,有丰富的业务经验。 业务需求人员的选择应覆盖系统所服务的业务部门。 D 文档整理人员 随时整理系统开发过程中相关的技术文档。 作为业务支撑,文档整理人员需熟悉软件开发的流程、文档管理、文档模板。 项目组织架构 项目经理 开发人员 业务需求人员 文档整理人员 测试工程师

E测试工程师 专门进行代码的测试工作,并且计划和执行源代码复审,负责有关返工的任何反馈意见(有条件可配置)。

二、项目流程管理 系统开发的过程必须符合IT 项目开发流程的规律,整个过程应包含但不仅限于以下环节: 需求调研是软件开发的最初阶段。需求调研的结果确立了软件开发的方向。软件设计是后续开发步骤及软件维护工作的基础。 在项目实施的过程中,项目实施者大多把精力放在了编码阶段,而需求调研和系统设计往往不被重视。没有严格的需求调研和分析,最终的软件产品会偏离用户的真正需求。如果没有设计,只能建立一个不稳定的系统结构。如下图所示:

在项目实施过程中,以上各个流程都不应该被忽略(重大项目更是如此),任何一个环节的遗失都可能引起项目方向的偏差,甚至失败。项目管理者可以在此基础上,完善项目管理流程,以降低项目实施的风险。 三、项目文档管理 项目管理者必须在系统开发过程中做好项目文档管理。项目文档是项目实施的依据,也是项目设计、编码、测试、修正、培训和验收的依据。 根据以上项目流程,项目实施过程中应包含以下所必须的文档:

了解转储(dump)设备

了解转储(dump)设备 David Tansley, 系统管理员, Ace Europe 2012 年7 月30 日 如果发生意外,IBM AIX? 操作系统会崩溃,此时您可能希望能够自动搜集相关信息。利用转储(dump)设备,可在这些设备上部署核心转储功能,从而准备转移到IBM 支持。 简介 如果由于意外事件导致系统崩溃,则会发生核心转储。事实上,并非总在出现系统崩溃时才发生核心转储。然而,在本文中,假定系统崩溃是由于严重事件或用户强制性动作所引起的。转储包含了达到崩溃时内存的内容。就其本质而言,崩溃总是不期而至,因而当崩溃发生时,系统管理员还是应当事先做好防范措施。能够确定崩溃的发生是否是由系统重启引起,此时在错误日志里存在具有标签为SYSDUMP的条目。 在本演示中,我使用的是AIX 7.1。不过,我所讨论的原理也适用于AIX 5.3 和 6.1。 回页首做好准备 要想防范意外的系统崩溃,需要确保具有转储设备逻辑卷(LV),用于在系统恢复时存放转储。然而,如果转储设备不可用,那么应该指定第二转储设备来存放转储。可能人们并不关心系统崩溃何时发生,因而也对进一步研究转储文件不感兴趣。这完全取决于系统所有者。但是,为保障系统正常运行,在rootvg 中包含主转储设备是很好的做法,也是很有必要的。可为转储设备执行镜像,但是,IBM AIX 支持对此发出警告。这是因为崩溃可能会被执行镜像或同步相关,这会导致转储设备上的镜像无效。在某些情况下,转储文件仅会被复制到镜像转储设备(位于镜像磁盘中)的其中一个副本,当系统重启时,很可能仅恢复转储文件副本一半的内容,最好的做法是,将主转储设备放到一个非镜像的磁盘中,将第二设备放到另一个非镜像磁盘中。然而,对rootvg 转储设备执行镜像比较常见。只要第二转储设备不在分页空间中,或不在磁带设备之类的外部设备中,则它可以位于rootvg 内部,也可位于其外部。 回页首转储设备

VS中的一些应用Debug和Release区别

Debug和Release区别 VC下Debug和Release区别 最近写代码过程中,发现Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这罗列汇总下,做为备忘~ 一、Debug 和Release 的区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 Debug 和Release 的真正区别,在于一组编译选项。 Debug 版本 参数含义 /MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库) /Od 关闭优化开关 /D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数) /ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译 GZ 可以帮助捕获内存错误 Release 版本参数含义 /MD /ML 或/MT 使用发布版本的运行时刻函数库 /O1 或/O2 优化开关,使程序最小或最快 /D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数) /GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改 Debug 和Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。

dump文件查看器使用方法

Windbg-分析Windows蓝屏原因利 软件启动点File——Open Crash Dump,如图: 然后找到你的minidump文件夹,dump文件一般是"时间.dmp"如图: 打开后就会自动分析了。分析完后,看最下面,找到3.probably caused by这一行,如图:看,出来了吧那个myfault.sys文件就是罪魁祸首。 再补充点东西,

导入dump文件分析完毕后,不要关闭,在后面输入!analyze -v ,这个命令可以查看dump 文件的详细情况,如图: 对普通用户有用的还有下面一些信息: 第一行DEFAULT_BUCKET_ID: 错误类型,这个懂点编程和操作系统知识的朋友用得上点第三行PROCESS_NAME: XXX.exe 这个是导致错误的进程,查出是什么文件导致的蓝屏后,再看这里就知道是谁调用了错误文件,比如你查出123.sys导致蓝屏,但你查不到123.sys是哪个程序调用的,就可以用这个方法来看看,比如查出了是456.exe,你就可以在机子上或者网上搜索相关信息了。 好了,到这里相信大家已经学会怎么找到导致系统蓝屏的文件了,接下来怎么办呢?上网查资料,把导致蓝屏的那个文件名在网上搜索,基本就知道是什么文件了,一般网上也有相关的解决办法,看看要删除些什么插件、打什么补丁或者重装软件等等。导致问题的不一定是.sys文件也有可能是.dll,这篇文章只能帮你找出导致蓝屏的元凶,具体的解决办法得上网查。如果是查不到什么信息的.sys或者.dll就要当心了,有可能是病毒或者rootkit 附: windbg基本调试命令: r 可以显示系统崩溃时的寄存器,和最后的命令状态。 dd 显示当前内存地址,dd 参数:显示参数处的内存。 u 可以显示反汇编的指令 !analyze -v 显示分析的详细信息。 kb 显示call stack 内容 .bugcheck 可以显示出错的代码 windbg诊断蓝屏的一点补充

AIX的Dump文件学习笔记(原创)

AIX的Dump文件学习笔记(原创) DUMP文件概述 为了增强故障分析能力,IBM的服务器增加了对设备故障当前环境的保存功能,就是保存一份设备故障时的内存、CPU寄存器、IO等设备的数据和状态信息,如果系统并没有停住,只是某个程序死掉,会产生CORE DUMP,在当前目录下产生一个CORE文件。而如果操作系统死掉,则产生System DUMP或者System Crash,通常会引起系统停机。DUMP的记录如下图所示。 作为一般客户通常只需要收集DUMP信息,并反馈给IBM工程师即可。当发生系统DUMP时,机器将会被宕下来。可能的原因包括:系统在进行内核操作时发生了未知的意外或者不能对其进行正常处理,都会引起DUMP。也可以由系统管理员发出命令,强制系统DUMP。 当系统进行DUMP时,DUMP管理设施自动将内核相关的数据(kernel segment0及其他由内核或者内核扩展程序记录在主DUMP表中的内存块)复制到主DUMP设备。可以把DUMP理解为系统当时的一个快照,供以后分析,分析DUMP可以在其他机器上进行,但需要复制一份此机器的内核程序,即unix_mp或unix_mp64.没有对应于DUMP的内核程序是午饭进行DUMP分析的。 DUMP的生成过程 CORE DUMP的生成过程 在进程运行出现异常行为时,例如无效地址访问、浮点异常、指令异常等,将导致系统转入内核态进行异常处理(即中断处理),向相应的进程发出特定信号例如SIGSEGV、SIGFPE、SIGILL 等。如果应用进程注册了相应信号的处理函数(例如可通过sigaction 注册信号处理函数),则调用相应处理函数进行处理(应用程序可以选择记录信息后生成core dump 并退出);否则将采取默认动作,例如SIGSEGV 的默认动作是生成core dump 并退出程序。 进程coredump 的时候,操作系统会将进程终止并释放其占用的资源,正常情况下,应用进程coredump 不会对系统本身的运行造成危害。当然如果系统中存在与此进程相关的其他进程,则这些进程会受到影响,至于后果则视其对此异常的具体处理而定。 由于相关指令已经包含在可执行文件中,core 文件一般只包含进程异常时相关的内存信息。其格式可参考/usr/include/sys/core.h 或者AIX 帮助文档的“Files Reference”章节。我们一般需要结合core 文件以及可执行程序,来分析问题所在 注:由于进程信号处理本质上是异步的,应用进程注册的信号处理函数中使用的例程需要保证是异步信号安全的,例如不能使用诸如pthread_ 开头的例程。 系统dump 生成过程 系统异常dump 的具体过程与应用进程类似,但由于更接近底层,为了避免问题所在的资源(例如文件系统)正好包含在生成dump 需要使用的资源中,造成dump 无法生成,操作系统一般会用最简单的方式来生成dump。例如系统内存小于4G 的情况下,一般直接将dump 生成在pagingspace 中;大于4G 时,会建专门的lg_dumplv 逻辑卷(裸设备),默认的dump设备/dev/hd6,次设备是/dev/sysdumpnull 保存dump 信息。在系统重启的时候,如果设置的DUMP 转存目录(文件系统中的目录)有足够空间,它将会转存成一个文件系统文件,缺省情况下,是/var/adm/ras/ 下的vmcore* 这样的文件。 下面是常见的转储设备大小规则 当服务器的内存大于4GB时,在安装AIX时,就会为系统dump 创建一专用区域,该逻辑卷名就是lg_dumplv. 其缺省大小是按以下规则分配的: 4GB < = 服务器的内存〈12GB lg_dump 的大小为1GB 12GB < = 服务器的内存〈24GB lg_dump 的大小为2GB 24GB < = 服务器的内存〈48GB lg_dump 的大小为3GB 48GB < = 服务器的内存lg_dump 的大小为4GB 系统dump 一般可以通过升级微码、提高系统补丁级别、升级驱动等方式解决。

release2更新说明

天工开物众包平台release2版本更新说明 一平台用户端 新增功能 1.首页增加联系方式的电话号码、二维码展示 2.用户注册成功后增加修改昵称的引导功能 3.我得团队加“加入已有团队”按钮 4.团队管理增加解散团队、发布队内公告、成员查看队内公告功能 5.团队综合能力展示图增加得分说明 6.项目发布增加公开、邀请发布功能 7.项目各环节节点增加短信提醒(报名、报名截止、项目变更、项目完成) 8.设计师资质logo、业主主页展示logo、设计师主页展示logo、项目logo、团队logo 增加备选库 9.增加投诉与建议功能 10.增加给运营端留言功能 调整功能 1.首页站内信图标未读条数增加自动刷新功能 2.首页设计团队,申请加入团队时增加填写“备注” 3.设计师资质信息增加元素身份证正反面、毕业证书、学位证书、工作经历 4.设计师资质信息-专业增加“水保”,“节能”,“财务分析”,“概(预)算”专业,去 掉“地址”,“土建”,“技经” 5.设计师资质认证中项目经历-类型增加“其他”选项 6.设计师可同时申请加入多个团队 7.团队管理页面增加申请加入的数量提示 8.项目类型增加“专项设计”、“其他”类型 9.项目发布时项目类型修改为可多选 10.招募中的项目,报名按钮位置向上调整 11.业主选定团队时商务报价显示=原值*0.4和团队能力得分显示=原值*0.6 12.设计师的团队不能报名自己发布的项目 13.站内信打开方式调整 二运营管理端 新增功能 1.增加欢迎页面及快捷方式 2.增加主页显示设置-轮播图展示设置、热门项目设置、团队展示设置、设计师及大咖 设置功能 3.增加修改项目状态、修改项目每个类型对象的执行阶段功能 4.平台用户管理功能增加重置密码功能、维护用户设计师及业主资质信息功能 5.资质审核增加查看上一版本功能 6.增加管理端人员管理、角色管理、权限维护及可配置显示菜单功能 7.增加项目变更功能 8.项目增加挂起功能

软件项目开发流程规范Release_051227

软件项目开发流程规范 2015年3月

版本管理

目录 1.0目的 (4) 2.0范围 (4) 3.0责任 (4) 4.0流程文件列表 (4) 5.0开发工作流程图 (5) 6.0实施步骤与干系人关系 (5) 6.1产品意向提出 (6) 6.2市场调研及产品规划书起草 (6) 6.3产品规划书评审 (6) 6.4流程类型选择 (7) 6.5需求说明书起草与日程表拟定 (7) 6.6需求说明书与日程表评审 (8) 6.7测试用例与测试计划起草 (8) 6.8测试计划评审 (8) 6.9概要设计与概要设计书起草 (9) 6.10概要设计书评审 (9) 6.11项目计划与项目分解 (9) 6.12项目计划评审 (10) 6.13项目软件开发及例会与汇报制度管理 (10) 6.14软件测试和测试报告 (11) 6.15项目总结与产品发布 (11) 7.0风险管理 (11) 附件1:开发工作流程图 (13) 附件2:编号规则及文档列表 (16)

软件项目开发流程规范 1.0目的 建立并文件化一种软件产品的规划、评审、设计、计划、开发、控制与测试的流程,以确保软件产品能够在规定的时间内达到所有指定的需求。 本规范特别强调在项目进行过程中持续进行的高效能的团队沟通以及及时总结,良好的流程依赖于执行者忠实地贯彻才能够发挥最大的作用。 2.0范围 本流程适用于任意门(格崇科技信息有限公司)所有新产品的开发,包括从初始的产品概念提出一直到进入产品发布,其包括了完整软件开发流程和简化软件开发流程两类开发流程。其项目阶段包括:产品意向提出、市场调研及产品规划书起草、产品规划书评审、流程类型选择、项目需求说明书起草与日程表拟定、需求说明书与日程表评审、测试计划起草、测试计划评审、概要设计与概要设计书起草、概要设计书评审、项目计划与项目分解、项目计划评审、项目软件开发及例会与汇报制度管理、软件测试和测试报告、项目总结与产品发布等阶段。 3.0责任 任意门团队负责管理本流程,并负责维护和保障本流程的实际运行。 项目干系人包括:部门总经理、运营总监、产品经理、项目经理、设计负责人、开发人员、测试人员及技术总监等其他支持人员。 4.0流程文件列表 ●产品意向说明 ●流程检查表 ●产品规划书 ●产品规划书评审意见表 ●需求说明书

程序调试文档

目录 1.1参数调整 (2) 1.2电机调试 (2) 1.2.1例程 (2) 1.2.2说明 (3) 1.3颜色传感器调试 (3) 1.3.1例程 (3) 1.3.2说明 (4) 1.4巡线传感器调试 (4) 1.4.1例程 (4) 1.4.2说明 (6) 1.5舵机调试 (6) 1.5.1例程 (6) 1.5.2说明 (10) 1.6关于机器人的使用 (10)

1.1参数调整 参数直接写在setup函数的开头,如:SPEED1=150;。 SPEED1:左轮速度(0-255);SPEED2:右轮速度(0-255); 以上两个参数用于控制机器人巡线行进时的速度。左右电机由于质量上的差异,同一PWM值下速度可能有些许不同,故需要分别设置。 TURN:转弯速度(0-255); BACK:刹车延时(>=0毫秒); DELAY:转弯延时(>=0毫秒)。 1.2电机调试 1.2.1例程 #include "Car.h" Car mycar(8,9,10,11,5,6); void setup(){ mycar.Mode(); mycar.Infer(1,1); } void loop(){ mycar.Move(140,140,8,1000);

} 1.2.2说明 电机调试主要是检测当机器人前进时电机的转向是否正确。使用Car类的Infer成员函数进行检测,其中两个参数分别对应左右轮,参数值只取0和1。通过改变参数,可改变电机转向。例如:使用上述例程进行调试时,若左轮后退,则应将参数改为:mycar.Infer(0,1);。 1.3颜色传感器调试 1.3.1例程 #include "Function.h" //包含变量的定义和函数的实现 #include "ColSensor.h" //颜色传感器类 #include "Track.h" //巡线传感器类 #include "Car.h" //小车类 #include "ColQueue.h" //队列类 #include "Servo.h" void setup(){ mysensor.Mode(); Ready(); }

测试流程规范文档

软件测试流程规范 测试人员要站在用户的角度来思考,这个产品是不是用户需要的。 一、软件发布流程流程: (1)、产品需求分析:根据客户或者用户提出的功能需求,对产品功能逻辑进行需求的分析,了解客户需要一个什么产品。 (2)、设计测试用例:根据客户的需求,进行功能流程设计,主要包括正确的逻辑和错误的逻辑,同时需要设计一些特殊内容输入,如特殊字符、空格以及不同的环境。 (3)、测试用例评审:将设计好的测试用例与领导开发同事一起进行评审,检查是否有遗漏的地方。 (4)、执行测试用例:开发人员在功能开发完毕后完成在开发环境的测试后,提交到测试环境,测试人员开始执行测试用例。 (5)、跟进测试问题:开发修复问题后,对BUG进行修复后的测试跟进工作,在产品上线前需要将版本的BUG进行一次修复确认测试。(6)、提交测试报告:完成一个迭代版本的测试之后,需要提交次版本的质量情况。 二、软件测试类型: (1)、单元测试:对软件中最小的可测试单元进行检查和验证,这个一般开发人员自己就做了。

(2)、集成测试:是确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。这里测试人员可以根据设计的测试用例来执行功能测试。 (3)、系统测试:简单的说就是对整个软件进行测试,执行整个系统的全部测试用例。(但是系统测试还包括恢复测试、安全测试、压力测试) (4)、验证测试:通俗的可以理解为是对软件系统的检查,软件是否满足功能需求,这个可以根据需求文档来进行,验证测试也可以理解为客户的验收测试。 三、测试用例的编写规范 (1)、测试用例包括以下内容:用例编号、测试项目、功能模块测试小标题、操作步骤、问题详细描述、PASS&FAIL、优先级、研发确认、测试者&时间、验收结果、备注。 (2)、测试用例表格文件命名规则:项目名称+版本号+更新日期(年月日),如果有自己习惯的方式可以不按照这样命名。 (3)、BUG跟进表包括以下内容:编号、BUG小标题、开发者、优先级、创建时间、是否完成、完成时间、类型、状态。 (4)、测试结果数据:主要记录用例的执行情况和BUG的修复情况。详细信息见下图:

TcpDump文件格式和结构

查看文章 Tcpdump文件格式和结构 2009-04-13 14:07 前言:层层剖析Tcpdump文件格式。 当你在Windows或者Linux环境下用tcpdump命令抓取数据包时,你将得到如下格式的tcpdump文件: 文件头| 数据包头 | 链路层数据 | 数据包头 | 链路层数据 | 数据包头 | 链路层数据 |...... 1. 文件头:每一个文件都以一个24字节的文件头开头。前四个字节是tcpdump 文件标志“A1 B2 C3 D4”或为“D4 C3 B2 A1”。 2. 数据包头 | 链路层数据:文件头之后,就是“数据包头 | 链路层数据”为一组的这样一组组数据。 3. 数据包头长度16个字节,它不是网路上真正传输的数据,它包含的信息主要是截获这个包的时间等信息。数据包头的第8-11和12-15字节(按编程习惯,第一个字节为0字节)表示后面链路层数据包的长度。8-11字节是其理论长度,12-15字节为其实际长度,如果存在截断情况,两者可能不同。如果在tcpdump 命令中使用了 -s 0 参数,则8-11字节和12-15字节应该相等。 从数据包头结束,到长度指明的字节数为止,是实际在网络中传输的链路层数据包。然后,就是下一个数据包头。 4. 链路层数据 链路层数据包格式和传输的方式有关:局域网共享上网,则是RFC894以太网协议,少数情况下是RFC 1042和802.3协议;如果是Modem拨号上网,则是RFC 1055的SLIP协议;如果是ADSL,则是RFC 1548的PPP协议。RFC894/RFC 1042/RFC 1548这三种协议的格式都是: 包头 | IP数据包 |(包尾) 对于RFC894,包头长度为14字节; ------>局域网方式上网; 对于RFC1042,包头长度为22字节; 对于RFC1548,包头长度为5字节;------>ADSL方式上网; 跨过这些包头字节,就是IP数据包了。 5.IP数据包: IP数据包格式为: IP包头 | IP包数据

Oracle 11g R2 升级方案

Oracle 11g R2 升级方案 一、版本升级路线 Table 2-1 contains the required upgrade path for each release of Oracle Database. Use the upgrade path and the specified documentation to upgrade your database. Table 2-1 Upgrade Paths

二、滚动升级 Table 1-2 summarizes the various methods for performing rolling upgrades. Also, see Oracle Database High Availability Best Practices for help choosing a method to perform database upgrades. Table 1-2 Methods for Performing Rolling Upgrades

三、升级方法 Depending on the environment, there are several alternatives available when upgrading a database. This section discusses why a particular method would be chosen, lists considerations when using each method, and gives pointers to additional useful information.

软件测试文档

1.测试分类 1.1.系统测试 系统测试是在所有单元、集成测试后,对系统的功能及性能的总体测试。 1.2.确认测试 模拟用户运行的业务环境,运用黑盒测试方法,验证软件系统是否满足用户需求或软件需求说明书中指明的软件特性(功能、非功能)上的。从测试原理上分为:白盒测试、黑盒测试和灰盒测试。 1.3.白盒测试 通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。 1.4.黑盒测试 通过使用整个软件或某种软件功能来严格地测试, 而并没有通过检查程序的源代码或者很清楚地了解该软件的源代码程序具体是怎样设计的。测试人员通过输入他们的数据然后看输出的结果从而了解软件怎样工作。 在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收和正确的输出。 黑盒测试方法主要有等价类划分、边界值分析、因—果图、错误推测法。等价类划分:是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例.该方法是一种重要的,常用的黑盒测试用例设计方法。 1.5.灰盒测试 灰盒测试就像黑盒测试一样是通过用户界面测试,但是测试人员已经有所了解该软件或某种软件功能的源代码程序具体是怎样设计的。甚至于还读过部分源代码。 因此测试人员可以有真对性地进行某种确定的条件/功能的测试。从软件特性上分为功能测试和性能测试。 1.6.功能测试 是指为了确保软件系统功能实现的正确性,完整性和其他特性而进行的测试。 性能测试:是指为了评估软件系统的性能状况,和预测软件系统性能趋势而进行的测试和分析。 END

驱动蓝屏后调试DUMP文件 无PDB文件

关于分析DUMP文件的一些想法: 在分析一个驱动蓝屏的时候,如果有驱动的PDB文件就很容易找到出错的地方,然是如果没有PDB文件,往往比较麻烦,只能给出个大题的东西,今天调试了一下DUMP文件,有点感触,先来分析一下, 双机调试的方法不说了,直接开始调试:加载驱动文件,直接蓝屏了,这个时候WINDBG 给出了一下提示: FOLLOWUP_IP: HelloDDK+5ae f7c455ae 8be5 mov esp,ebp BUGCHECK_STR: 0x7E DEFAULT_BUCKET_ID: NULL_DEREFERENCE LAST_CONTROL_TRANSFER: from f7c455ae to 8060d589 STACK_TEXT: f7a01c54 f7c455ae 00000000 0000000a 0000000a nt!ProbeForWrite+0x39 WARNING: Stack unwind information not available. Following frames may be wrong. f7a01c74 f7c45504 f7a01d4c 805777f1 864d2b10 HelloDDK+0x5ae f7a01c7c 805777f1 864d2b10 860cd000 00000000 HelloDDK+0x504 f7a01d4c 80577901 800008a8 00000001 00000000 nt!IopLoadDriver+0x66d f7a01d74 80535c32 800008a8 00000000 865b4020 nt!IopLoadUnloadDriver+0x45 f7a01dac 805c71e0 f7a69cf4 00000000 00000000 nt!ExpWorkerThread+0x100 f7a01ddc 80542e12 80535b32 00000001 00000000 nt!PspSystemThreadStartup+0x34 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 SYMBOL_STACK_INDEX: 1 SYMBOL_NAME: HelloDDK+5ae FOLLOWUP_NAME: MachineOwner MODULE_NAME: HelloDDK IMAGE_NAME: HelloDDK.sys DEBUG_FLR_IMAGE_TIMESTAMP: 4d60d8a6 STACK_COMMAND: .cxr 0xfffffffff7a01880 ; kb FAILURE_BUCKET_ID: 0x7E_HelloDDK+5ae

Oracle_11g_Release_2_Linux版本安装指南

Oracl e 11g Rel ease 2 (11.2) Installation 适用Oracle Linux 5, and RHEL 5环境下 (一)内存要求 最小:1 GB的RAM 推荐:2 GB的RAM或更多 查看内存大小:grep MemTotal /proc/meminfo 确定配置的交换空间的大小grep SwapTotal /proc/meminfo 确定可用的RAM和交换空间free 确定可用的共享内存量df -h /dev/shm/ 注意:共享内存的大小应是至少大MEMORY_MAX_TARGET和MEMORY_TARGET为计算机上的每个Oracle实例。注意:MEMORY_MAX_TARGET和MEMORY_TARGET时不能使用LOCK_SGA 启用或Linux上的大页面。 (二)磁盘空间要求 1GB的磁盘空间/tmp目录 确定磁盘空间的使用量/tmp目录df -h /tmp (三)确定系统架构是否可以运行该软件uname -m

(四)显示需求 对于Oracle 数据库11g第2版(11.2)最小分辨率为1024 x 768或更高。 (五)操作系统需求 Oracle 数据库11g第2版(11.2)操作系统的以下或更高版本: ?Asianux Server 3 SP2 ?Oracle Linux 4 Update 7 ?Oracle Linux 5 Update 2 ?Oracle Linux 6 ?Red Hat Enterprise Linux 4 Update 7 ?Red Hat Enterprise Linux 5 Update 2 ?Red Hat Enterprise Linux 6 ?SUSE Linux Enterprise Server 10 SP2 ?SUSE Linux Enterprise Server 11 Oracle 数据库11g第2版(11.2)开始,增强型Linux(SE Linux的)功能的安全性支援Oracle 的Linux 4,红帽企业Linux 4,甲骨文的Linux 5和Red Hat企业版Linux 5。 确定安装的Linux发行版和版本 cat /proc/version (六)内核要求 Oracle Linux 4 and Red Hat Enterprise Linux 4: 2.6.9 或更高版本 Asianux Server 3, Oracle Linux 5, and Red Hat Enterprise Linux 5: 2.6.18 或更高版本 Oracle Linux 6: 2.6.32.100 或更高版本 Red Hat Enterprise Linux 6: 2.6.32-71 或更高版本 SUSE Linux Enterprise Server 10: 2.6.16.21 或更高版本

使用dump文件分析系统蓝屏原因

使用dump文件分析系统蓝屏原因 出处:https://www.360docs.net/doc/7819007530.html,/746253/709702 目录 1 什么是dump文件 2 如何让系统在崩溃时记录dump文件 3 使用Debugging Tools for Windows (windebug)来分析dump文件 3.1 什么是windebug 3.2 windebug最新版安装方法(此方法为在线安装) 3.3 windebug的symbol符号文件的路径配置 3.4 dump文件的分析

1 什么是dump文件 当系统崩溃在蓝屏瞬间,系统会形成一个扩展名为dmp的存储器转储文件,默认存储位置为C:\WINDOWS\Minidmp。 2 如何让系统在崩溃时记录dump文件 A.右击“我的电脑”选择“属性”,在“系统属性”对话框中选择“高级” B.在“启动和故障恢复”中选择“设置”,具体设置如下图所示

3 使用Debugging Tools for Windows (windebug)来分析dump文件 3.1什么是windebug windebug是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。 3.2 windebug最新版安装方法(此方法为在线安装) A.从https://www.360docs.net/doc/7819007530.html,/download/en/details.aspx?displaylang=en&id=8279下载 B.安装netFramework2.0 C.运行1中下载的winsdk_web.exe

Channel Release信令里面的Cause(事件号)分析

Channel Release信令里面的Cause (事件号)分析 对应的网络发生的事情,在这里我们可以看到很多网络释放的原因,例如:我们平时测试时,在被叫MS没有人接听或者正在通话的情况下,就会统计成一次连接失败,如果我们在报告里面仅仅用文字表达的话,说服力不强,但是要是在报告里面能说明Cause是17、19的话就很容易说服别人,还有拥塞也可以在信令里面看到Cause是34,除次以外还有很多Cause,可以看下表: 编号原因 1 Unassiagned number(未分配的号码(空号)) 3 No route to destination(无至目的地的路由) 6 Channel unacceptable(不可接受的信道) 16 Normal clearing(正常清除) 17 User busy(用户忙) 18 No user responding(无用户响应) 19 User alerting,no answer(已有用户提醒,但无应答) 21 Call rejected(呼叫拒绝) 22 Number changed(号码改变) 26 Non selected user clearing(清除未选择的用户) 27 Destination out of order(终点故障) 28 Incomplete number(无效号码格式(不完全的号码)) 29 Facility rejected(设施被拒绝) 30 Response to status enquiry(对状态询问的响应) 31 Normal,unspecified(正常,未规定) 34 No circuit/channel available(无电路/信道可用) 38 Network out of order(网络故障) 41 Temporary failure(临时故障) 42 Switching equipment congestion(交换设备拥塞) 43 Access information discarded(接入信息被丢弃) 44 Requested circuit/channel not available(请求的电路/信道不可用) 47 Resources unavailable,unspecified(资源不可用,未规定) 49 Quality of service unavailable(服务质量不可用) 50 Requested facility not subscribed(未预订所请求的设施) 55 Incoming calls barred within the CUG 57 Bearer capability not authorized(承载能力未认可)

相关文档
最新文档