c语言dump函数,抓取dump

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: