摘要:当我们在windbg里执行lm指令后,回见到如下情况: 有的模块名后面跟的时pdb symbols,表示已加载符号,且后面还跟着符号的详细路径。有的模块后面跟着的是deferred,表示模块已经加载,但是调试器还没有尝试加载它的符号。符号将在需要的时候被加载。那么什么是延迟加载? 符号延迟加载 默认
阅读全文
摘要:经常在调试分析dmup时,会看到很多线程栈在函数的后面会带上FPO,如下所示: 00 00eff818 777beb0d ffffffff 00000000 0107a2ec ntdll!NtTerminateProcess+0xc (FPO: [2,0,0])01 00eff8f0 762c4f3
阅读全文
摘要:前面有两个随笔介绍了这两个异常(《异常STATUS_INVALID_PARAMETER(0xC000000D)》和《关于异常STATUS_INVALID_CRUNTIME_PARAMETER(0xC0000417) 》),它们都是参数无效的异常,但针对的对象不一样。STATUS_INVALID_CR
阅读全文
摘要:简介 STATUS_INVALID_CRUNTIME_PARAMETER,值为0xC0000417,又称CRT参数无效异常,其定义如下: //// MessageId: STATUS_INVALID_CRUNTIME_PARAMETER//// MessageText://// An invalid
阅读全文
摘要:如何确保程序中的崩溃不可利用?简而言之,答案很简单:假设每个崩溃都是可利用的,然后修复它!至少,这是一个质量问题,在产品交付给客户之前解决这个问题通常更便宜、更实用。执行确定可利用性所需的分析可能会相当昂贵。分析与内存损坏相关的程序故障,以了解安全后果可能是一项复杂且容易出错的任务。必须考虑几个因素
阅读全文
摘要:简介 STATUS_STACK_BUFFER_OVERRUN,值为0xC0000409,又称栈缓冲区溢出异常,其定义如下: /// MessageId: STATUS_STACK_BUFFER_OVERRUN//// MessageText://// The system detected an o
阅读全文
摘要:如果您花了任何时间编写代码,很可能您不得不处理异常处理。在Visual Studio中,当异常被抛出或最终未被处理时,调试器可以帮助您通过中断来调试这些异常,就像在遇到断点时中断一样。下面我们将讨论异常的不同分类,以及如何配置调试器何时为这些异常中断。 异常分类 我们将从调试器中异常的分类类型开始。
阅读全文
摘要:编写C/C++代码时,通常使用复杂的代码行来处理多个指针,例如,在单个行上访问多个指针。然而,当访问冲突发生时,很难破译这行代码的哪一部分是问题所在。为了调试这个问题,您可能已经将这一行代码分解成多行,但不会再这样了。当使用Visual Studio 2015更新1时发生这种情况时,您可以很容易地看
阅读全文
摘要:在Visual Studio 2015中,引入了新的异常设置窗口,该窗口提供了一种快速的方法,可以将调试器配置为在抛出异常时中断。作为窗口更新的一部分,仅仅按异常类型过滤并不总是足够好,您需要对调试器何时中断抛出的异常进行更细粒度的控制。因此,在Visual Studio 2017中,引入了一个新功
阅读全文
摘要:在Visual Studio中使用调试器浏览代码时,有许多选项,包括设置断点、单步执行和使用Run-to-Cursor。在Visual Studio 2017中,引入了Run to Click,这是一种更容易调试代码的新方法——点击式风格。不再需要设置临时断点或多次执行步骤来执行代码并在所需的行上停
阅读全文
摘要:“反汇编”窗口显示与编译器所创建的指令对应的汇编代码。 如果你正在调试托管的代码,这些程序集指令对应于在实时 (JIT) 编译器,而非 Microsoft 中间语言 (MSIL) 由 Visual Studio 编译器创建所创建的本机代码。在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的
阅读全文
摘要:寄存器是处理器(CPU)中的特殊区域,用于存储处理器需要当前处理的少量数据。 编译或解释源代码时会生成一些指令,这些指令根据需要将数据从内存移动到寄存器或反之。 相对于访问内存数据,访问寄存器数据非常快。那些允许处理器将数据保留在寄存器并多次访问的代码,比起那些需要处理器不断加载和卸载寄存器的代码执
阅读全文
摘要:大多数的应用程序都使用多线程技术。对应Windows应用程序,为了能够使用户界面保持快速响应,经常需要把费时的任务放在与主应用程序独立的线程上运行。此时,多个线程的并发执行调试变得很困难,特别是在多个线程访问同一个类和方法时。Threads能够帮助我们减轻复杂度。 打开窗口 一般来说当程序遇到断点进
阅读全文
摘要:前面有个案例最终查明原因是System.Convert.ToInt16的调用导致溢出异常: 0:000> !PrintException /d 4ee2e8f4Exception object: 4ee2e8f4Exception type: System.OverflowExceptionMess
阅读全文
摘要:什么是OverflowException 就是溢出异常。这个一般是当在线程检查的上下文中执行的算术、强制转换或转换运算导致溢出时引发的异常。 继承 Object Exception SystemException ArithmeticException OverflowException 说明 在运
阅读全文
摘要:Memory窗口可用于查看特定位置的原始内存数据。前面介绍的Watch、Autos和Locals窗口可以查看位于内存特定位置的变量值,而Memory窗口则会显示存储在内存中的数据概貌。 打开窗口 通过菜单栏打开 快捷键打开Ctrl+Alt+M 数字(1...4)按下组合键后,状态栏如下 然后在按数字
阅读全文
摘要:什么是NullReferenceException 试图访问或取消引用空对象引用时引发的异常。 继承链 Object Exception SystemException NullReferenceException 说明 尝试访问值为空的类型上的成员时,将引发NullReferenceExcepti
阅读全文
摘要:简介 定义于头文件 <stdexcept> class out_of_range; 定义要作为异常引发的对象类型。它报告试图访问定义范围之外的元素所导致的错误。它可以由std::bitset和std::basic_string的成员函数、std::stoi和std::stod函数族以及边界检查的成员
阅读全文
摘要:高级断点语法 高级断点语法由两部分组成: 上下文部分.用函数,源文件和二进制模块来指定上下文,上下文的表示方法: {[函数],[源文件],[二进制模块]}。 位置,表达式,变量或Windows消息条件. 必须指定唯一的,足够的上下文信息才能获取断点位置.如:在TEST.CPP的20行设一位置断点,语
阅读全文