DbgHelp教程3——Minidump

Minidump文件用来事后调试。DbgHelp库提供写Minidump的MiniDumpWriteDump方法。其实不光是程序崩溃的时候可以写dump,运行的任何时候都可以写个dump。 虽然名称是MiniDump,但有可能写的dump文件比FullDump都大,因为dump里面包含的信息不一样。MiniDumpWriteDump包含了一个MINIDUMP_TYPE参数,指定了dump类型: MiniDumpNormal。默认类型,只有当前线程的调用栈 MiniDumpWithDataSegs。所有加载模块的数据段 MiniDumpWithFullMemory。进程所有可达的内存,这个生成的dump文件非常大 MiniDumpWithHandleData。包含句柄信息 以下就是一个生成dump的例子: 往往我们希望在程序发生未处理的异常导致崩溃的时候来生成dump,因此我们可以注册这些这些异常的处理回调函数,在回调函数里面生成dump。 最常用的是SetUnhandledExceptionFilter函数,当程序发生未处理的SEH异常的时候,就会回调注册的处理函数。还有_set_invalid_parameter_handler函数,它可以注册CRT检测到的无效参数异常处理函数。_set_purecall_handler它可以注册纯虚函数调用异常处理函数。更多的异常函数,可以参考http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cplusplus。 chromium里面的崩溃收集系统使用的Breakpad,跨平台,设计精良。有空写一些文章来介绍。 ... Read More | Share it now!

DbgHelp教程2——栈回溯

调试的时候经常用到栈回溯来定位问题。获得栈回溯并不难,直接通过CaptureStackBackTrace这个API就可以获得。另外可以可以通过DbgHelp库里面的StackWalk64函数获得。 用CaptureStackBackTrace获取调用栈很简单: StackWalk64的方法稍微复杂一点,首先要获得CONTEXT。获取CONTEXT有两种办法,一是通过内联汇编获取: 另外一种是调用RtlCaptureContext获取: 获取到CONTEXT之后就用StackWalk64遍历调用栈: 我们获得的调用栈都只是一些栈帧地址,如果要知道明确的函数名,还需要把地址翻译成符号名,封了一个PrintCallStackBackTrace,就是把栈帧地址翻译成可读的符号地址:   ... Read More | Share it now!

DbgHelp教程1——初始化

以下是初始化DbgHelp最简单的代码: SymSetOptions函数是设置DbgHelper的功能选项,具体用法见https://msdn.microsoft.com/en-us/library/windows/desktop/ms681366(v=vs.85).aspx。 SymSetOptions参数为0的时候,表示所有的选项都关闭,一下是常见的选项解释: SYMOPT_ALLOW_ZERO_ADDRESS。允许符号没有地址。默认的DbgHelp会过滤掉没有地址的符号。 SYMOPT_CASE_INSENSITIVE。所有的搜索符号不区分大小写。 SYMOPT_DEBUG。通过OutputDebugString或者SymRegisterCallbackProc64... Read More | Share it now!

Blink/Webkit浏览器内核崩溃分析过程总结

前两天技术团队旺旺群里有同事提出一个问题:在debug模式下,Chromium浏览器打开http://product.suning.com/125073744.html页面renderer进程就立即崩溃。团队对于Blink/Webkit内核问题的分析经验不多,故把分析过程写出一个总结,希望对大家以后分析此类问题有帮助。 多进程调试 Chromium浏览器是多进程的架构。而Blink内核在renderer进程,debug模式下,VS调试不能抓到renderer进程的异常,也就无法定位问题。所以解决问题的第一步是把VS调试器附加到问题相应的renderer进程。 Chromium已有一篇文档讲述如何调试Chromium。对于浏览器子进程的调试,有一个–wait-for-debugger-children的命令行参数。给浏览器传递这个命令行参数之后,生成的子进程都会在一开始等待调试器60秒附加上去。另外这个命令行还可以指定是plugin进程还是renderer进程。因为这次调试的对象是renderer进程,故我们在VS调试器设置–wait-for-debugger-children=renderer传递给被调试的浏览器。 重现问题 用VS打开Chromium的源代码工程,并在debug模式下运行。启动浏览器之后,新建tab页,在地址栏里输入会导致renderer进程崩溃的网址http://product.suning.com/125073744.html。这时候就是生成对应的renderer进程。这个renderer进程在60秒等待我们把调试器附加上去。 我们找到新建renderer进程的PID,然后用VS的debug->Attach... Read More | Share it now!

visual studio的Function Evaluation调试功能

今天公司技术群里老大提及GDB调试器有个牛逼的功能,在断点的情况下执行程序里的函数。如下代码: 在GDB中直接输入a.print或者pa->print()就执行a对象的print方法,有时候这样对于调试非常方便。然后有其他同事说vs也有类似功能,叫做Immediate... Read More | Share it now!

visual stdio调试中的数据类型可视化Debug Visualizers

前言 c++可以灵活自定义非常复杂的数据结构,比如标准库中的vector,map,还有很多是用户自定义的数据。通常调试器只能解释显示一些基本的数据变量,比如int,float,能够漂亮的显示标准库的那些类就算非常不错了,比如string。对于一些用户自定义的类型,往往调试器显示出来的变量值没有什么用,有时候就想能够自己自定义的方式友好的显示调试变量值。 之前vs是通过autoexp.dat的方式支持用户自定义显示变量值,如这篇博客所介绍的:Customize... Read More | Share it now!

chromium中的性能优化工具syzyProf

函数性能分析工具SyzyProf 我先开始介绍SyzyProf。这个工具可以捕获每个线程调用每个函数执行的时间,然后把结果生成一个KCacheGrind能够识别的数据格式文件,然后通过KCacheGrind的展示结果。你就可以知道函数哪个函数执行了次数最多,消耗的时间最多,哪个线程在读写文件,哪个线程在创建窗口界面,而且KCacheGrind以图形的方式显示出函数调用链等信息,非常直观。如图这是我生成CEF自带demo程序的函数调用信息。 其实能够函数性能分析工具已经够多了,比如xperf,AQTime,还有visual... Read More | Share it now!