c语言dump函数,抓取dump
目的捕捉正式环境程序运行时崩溃堆栈、操作系统等信息,用于找到碰撞的位置、原因,解决臭虫。
Windows操作系统操作系统环境:window10 x64,vs2019,cmake3.20,c 11及以上
方法一:VS2019程序中加入生成小型转储文件代码:#ifdef WIN32
#定义WIN32 _ LEAN _ AND _均值
#包含" Windows.h "
#包含" DbgHelp.h "
//静态LONG _ stdcall异常过滤器(LP exception _ POINTERS LP exception info);
int generate mindump(p exception _ POINTERS p exception指针)
{
//定义函数指针
typedef BOOL(WINAPI * minidumpwritedumt)(
手柄,
DWORD,
手柄,
小型转储类型,
PMINIDUMP _异常_信息
PMINIDUMP _ USER _ STREAM _ INFORMATION,
PMINIDUMP _ CALLBACK _ INFORMATION);
//从DbgHelp.dll的库中获取 MiniDumpWriteDump 函数
MiniDumpWriteDumpT pfnMiniDumpWriteDump=NULL;
h模块hDbgHelp=loadlibrary a( dbg帮助。dll’);
if (NULL==hDbgHelp)
{
返回异常_继续_执行;
}
pfnMiniDumpWriteDump=(minidumpwritedumt)GetProcAddress(hDbgHelp, MiniDumpWriteDump );
if (NULL==pfnMiniDumpWriteDump)
{
免费库(hDbgHelp);
返回异常_继续_执行;
}
//创建邻苯二甲酸二甲酯文件件
CHAR SZ文件名[MAX _ PATH]={ 0 };
CHAR * szVersion=( dump _ XXX );
系统时间
GetLocalTime(stLocalTime);
wsprintfa(%s-ddd-ddd.dmp深圳文件名,
szVersion,stLocalTime.wYear,stLocalTime.wMonth,stLocalTime.wDay,
stLocalTime.wHour,stLocalTime.wMinute,stLocalTime。ws second);
HANDLE hDumpFile=create filea(SZ文件名,GENERIC_READ GENERIC_WRITE,
FILE _ SHARE _ WRITE FILE _ SHARE _ READ,0,CREATE_ALWAYS,0,0);
if(INVALID _ HANDLE _ VALUE==hDumpFile)
{
免费库(hDbgHelp);
返回异常_继续_执行;
}
//写入邻苯二甲酸二甲酯文件
MINIDUMP _ EXCEPTION _ INFORMATION expParam;
展示图.ThreadId=GetCurrentThreadId();
展示图.异常指针=pexception指针;
展示图.客户端指针=FALSE
pfnMiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),
hDumpFile,MiniDumpWithDataSegs,(pExceptionPointers?expParam : NULL)、NULL、NULL);
//释放文件
CloseHandle(hDumpFile);
免费库(hDbgHelp);
返回异常执行处理程序;
}
静态LONG _ stdcall异常过滤器(LP exception _ POINTERS LP exception信息)
{
//这里做一些异常的过滤或提示
if (IsDebuggerPresent())
{
返回异常_继续_搜索;
}
返回GenerateMiniDump(lpExceptionInfo);
}
#endif
int main()
{
.
#ifdef WIN32
setunhandledexception过滤器(异常过滤器);
#endif
.
}修改项目属性-链接器-生成调试信息,如图:
打包时并不需要打包*.pdb,这类文件包含符号表等相关调试信息。假装此时发生了崩溃,生成了*.邻苯二甲酸二甲酯文件,直接拖动邻苯二甲酸二甲酯文件进vs2019即可开始调试设置对应生成的符号表位置,以及常规设置有些选项可以依据实际情况修改
方法二:
Linux操作系统操作系统环境:uos 21 gcc 8。3 .0 x86 _ 64-Linux-GNU cmake 20
方法一:goole breakpad编译安装早餐垫,以及一些使用方法https://www.jianshu.com/p/1e15640fae7ahttps://juejin.cn/post/6899070041074073614总结一下:不想啰嗦,请先看完相关使用文档参考此代码,将小型转储文件生成代码部分加入你的工程中,生成的程序必须带有调试信息,否则生成的倾销无法帮助精确定位问题位置,如g -g,cmake RelWithDebInfo生成模式等# include 客户端/Linux/处理程序/异常处理程序。 h
静态bool转储回调(const Google _ break pad:minidump描述符描述符,
void*上下文,布尔值成功){
printf(转储路径:%s\n ,描述符。path());
退货成功;
}
void crash(){ volatile int * a=(int *)(NULL);* a=1;}
int main(int argc,char* argv[]) {
Google _ break pad:小型转储描述符描述符(/tmp );
Google _ break pad:异常处理程序eh(descriptor,NULL,dumpCallback,NULL,true,-1);
crash();
返回0;
}dump_syms ./test test.sym生成符号表等调试信,根据测试。符号中第一行信息放置测试。符号文件,/symbols/exename/XXX/x . sym minidump _ stack walk minidump。转储./symbols crash.info,即可在崩溃信息查看崩溃信息,可精确到文件名和代码行数这里提一个批量生成符号的脚本,寻找工作目录下所有。因此和程序名的文件,生成对应位置的符号文件#!/bin/bash
#寻找工作目录下所有。因此和程序名的文件,生成对应位置的符号文件
#参数一工作目录,即需要生成符号的文件目录
#参数2程序名,我一般把生成的exe .因此放在一个目录
如果[ $#!=2 ];然后
回声参数错误
回声参数一工作目录,即需要生成符号的文件目录、exe、so所在目录
回声参数2程序名,我一般把生成的exe .因此放在一个目录
一号出口
船方不负担装货费用
# work _ dir=$(CD $(dirname $ 0);pwd)/RelWithDebInfo
# work _ dir=$(CD $(dirname $ 1);pwd)
work _ dir=$(CD $ 1;pwd)
# echo $(目录名$1)$工作目录$(基本名$ 1)
cd美元工作目录
# exe_name=jyclient
exe_name=$2
转储符号$工作目录/$执行名称$工作目录/$执行名称。符号
对于$work_dir/*中的文件。因此
做
如果测试-荷兰盾文件
然后
echo $文件文件
#${file% .*}包含目录的文件名不带后缀
#文件基本名称=$(基本名称$文件。所以)
dest_sym_file_name=$file.sym
echo $dest_sym_file_name
转储符号$文件$目标符号文件名
其他
回声$文件目录
船方不负担装货费用
完成的
symbos_dir=$work_dir/symbos
rm -rf $symbos_dir/*
对于$work_dir/*中的文件。符号
做
如果测试-荷兰盾文件
然后
echo $file sym_file
#文件基本名称=$(基本名称$文件. sym)
head1_str=$(head -n1 $file)
# echo$head 1 _ str
head1_arr=($head1_str)
dest _ dir=$ symbos _ dir/$ { head 1 _ arr[4]}/$ { head 1 _ arr[3]}/
echo $dest_dir
目标目录-便士目标目录
百万美元文件$目标目录
其他
回声$文件目录
船方不负担装货费用
完成的
# mkdir -p $work_dir/
# mv $work_dir/* .sym $work_dir/
# str=模块Linux x86 _ 64 479d 877 b 285 f 8203 a 4778 DD 3 e 86138d 90 libqsimplehttprequest。所以
# arr=($str)
# echo ${arr[3]}
# str=$work_dir/jyclient.sym
# echo ${str##*/}
方法二:格洛格
疑问及解答cmake RelWithDebInfo生成的程序太大怎么办?剥夺可以取掉二进制文件中的调试信息,大幅缩减大小,并且生成的邻苯二甲酸二甲酯文件仍然可以正常与符号文件生成精确的调试信息
备注:
什么是CMAKE_BUILD_TYPE:调试,发布,RelWithDebInfo和MinSizeRel?
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。