前言
这是 N 年前遇到的一个问题了。最近跟 DEBUG 宏对着干上了,正好翻到这篇总结 —— 记录了使用 pragma message 排查 同一个工程不同 CPP 中 DEBUG 宏的值不同的过程。现对之前的总结做了更新整理,分享给各位小伙伴儿。
在上一篇文章 《调试实战 | dll 加载失败之Debug Release争锋篇》中,由于两个工程中的 _ITERATOR_DEBUG_LEVEL 不同,导致了对同一个 map 的解析不同,从而导致了崩溃。在示例代码中,我是手动更改的该宏的值,在实际工程中,却另有玄机。在上文中故意省略了这部分内容的介绍。现把实际工程的问题在本文中做个相对详细的梳理总结。
先剧透一下:实际工程中的问题是因为一个工程中定义了 _DEBUG 宏,另外一个工程里没定义。但是我已经核对过,两个工程都没定义 _DEBUG 宏。其中一个工程的 _DEBUG 宏是从哪儿来的呢?
最近,项目里遇到一个 dll 加载不上的问题。实际项目比较复杂,但是解决后,又是这么的简单,合情合理。本文是我使用示例工程模拟的,实际项目中另有玄机,但问题的本质是一样的。本文从行文上与 《调试实战 | dll 加载失败之全局变量初始化篇》 非常相似,示例代码也非常相似(原谅我比较懒),感兴趣的小伙伴儿可以对比来读。
我在上一篇文章——《调试实战 | dll 加载失败之全局变量初始化篇》中,跟大家分享了一个由于全局变量初始化顺序导致的 dll 加载失败的例子。感兴趣的小伙伴儿可以点击阅读。
虽然我们知道了是由于全局变量初始化顺序导致的问题,也给出了解决方案。但是有一点却没有刨根问底——为什么改变文件在工程文件中的顺序就可以改变全局变量初始化顺序?是怎么影响的呢?本篇文章力求解决这个问题。
说明:本文很早就发布在我的博客上了,当时总结的有些问题,本次重新整理完善后再次发布。
有时候我们非常想知道当前系统内核的一些状态,比如查看当前系统加载了哪些驱动,查看某个进程外 COM 调用卡在哪里了,等等。如果我们可以调试系统内核,或者抓取一个系统转储来做事后调试,该多好啊。我们可以通过如下方法得到系统转储:
sysinternals中的 notmyfault 或者 使用快捷键让系统崩溃,并设置 系统崩溃的时候自动保存转储文件)(有点小题大作了:joy:)。sysinternals 中的 livekd,不需要特殊设置,绿色环保。以上几种方案中,使用 livekd 最方便快捷。如果有哪位小伙伴儿对其它几种方法感兴趣,可以查看之前的转储系列文章。为了能顺利使用 livekd,我们需要解决几个问题。
我在前面的文章——《使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境》分享了使用 windbg 进行双机内核调试的环境搭建的步骤。
有小伙伴儿留言说:在使用 vs 进行双机内核调试的时候,总是连不上。希望能发一篇使用vs进行双机内核调试的文章。今天,以视频形式分享下搭建过程。几本上是从零开始。
标题中的 101 请参阅 wikipedia 101。
我们在上一篇文章——本地内核调试环境搭建,就这么简单!中总结了本地内核调试的开启方法。本地内核调试有很多限制(比如,不能执行 .crash 来让系统蓝屏,不能执行 .dump 保存转储,不能下断点 ……),双机内核调试完全没有这方面的限制,可以说是真正意义上的内核调试。
双机内核调试主要分两种情况:
不论被调试系统运行在虚拟机中,还是运行在另外一台物理机中,系统设置都是一样的。本文简单梳理了常用的内核调试设置方法及连接方法。
在 蓝屏(BSOD)转储设置,看本文就够了! 这篇文章里比较详细的介绍了蓝屏转储设置。做好设置后,我们就可以在需要的时候使系统蓝屏了。这样我们就可以拿到一份系统转储,供我们分析问题了。本文介绍几种可以使系统蓝屏的办法。当然肯定还有其它办法,如果哪位小伙伴儿知道比较实用的方法,欢迎留言分享。