windows中的调试

C语言拯救者 番外篇 (Windows实用调试技巧) 调试是什么?有多重要?调试的基本步骤?Debug和Release版本的区别?编程常见的错误有哪些? 快捷键的使用方法和调试技巧? 阅读详情

windows中的调试

1.事后调试有两个最基本的目标:
 (1) 发现程序是在哪里崩溃的
 (2) 找出导致程序崩溃的原因
2.按优先选择顺序排列的调试技术:
 (1) 使用调试版本进行本地调试
 (2) 使用带有调试符号的发布版进行本地调试
 (3) 使用调试版本进行远程调试
 (4) 使用带有调试符号的发布版本进行远程调试
 (5) 使用 Dr.Watson 日志文件进行事后调试
 (6) 使用崩溃对话框的信息进行事后调试
3.返回类型为BOOL型的Windows API函数返回的值不一定是0或1,所以在编写带有调试功能的C++程序时,将返回值与TRUE进行比较是一件很冒险的事情,应避免这样做。返回类型为HANDLE的Windows API函数在有错误发生时,通常返回一个空的句柄,或返回INVALID_HANDLE_VALUE(值为-1)。返回类型为LONG或DWORD的Windows API函数则通常返回0或-1。如果一个API函数不可能有错误发生,它就返回VOID。可以通过GetLastError得到相应的错误码。
4.在Visual C++中通过在观察窗口中输入"@ERR, hr",可以监控GetLastError的返回值。
5.如果你希望在错误信息中显示错误码,可以通过FormatMessage API函数将错误码转换到文本格式。
6.永远不要重定位其他程序会使用的第三方DLL
7.优化版本通常不将EBP作为堆栈基址指针使用。这种优化类型称为帧指针省略(FPO)
8.因为优化版本可能不使用堆栈基址指针,如果函数原型声明不一致,就很可能会在函数返回时导致崩溃。
9.使用调试反汇编窗口查看你的源代码如何被转换成汇编代码
10.创建最有用的映射文件,通常使用/MAPINFO:LINES和/MAPINFO:EXPORTS工程选项。将你发布的程序的所有模块的映射文件归档。
11.使用Visual C++名字解析工具(Undname)将混合名字转换到原始名字。
Undname ?RandomException@@YGXHHHH@Z

输出:?RandomException@@YGXHHHH@Z == RandomException

-f选项显示出整个函数原型
Undname -f ?RandomException@@YGXHHHH@Z

输出:?RandomException@@YGXHHHH@Z == void __stdcall RandomException
11.调试版本的运行时刻函数库对内存的分配作了跟踪,并允许用户检查内存泄漏;在刚分配的内存里写上0XCD的字节模式,这有助于发现使用未被初始化数据的错误;在被释放的内存里写上0XCD的字节模式,这有助于发现使用已被释放的内存;在缓冲区的两边分配了四字节的保护数据,并用0XFD的字节模式作初始化,来检查写内存的上溢出和下溢出;在每个内存分配的地方对源代码文件名和行号作了记录,这有助于用户在源代码中对内存分配进行定位。所以,调试版本能发现多种的内存错误。
12.帧指针的省略(FPO)隐藏了函数原型不匹配的错误,这仅在调试版本中函数返回时会导致崩溃。
13.在调试版本中所有的变量都是volatile的。而在发布版本中如果一个变量未设置成volatile,那么便会有一个与优化相关的错误。如果时多线程,那程序出问题的可能性非常大。
15.发布版本中的变量优化问题:
void StackAttack () {
 int optimizedOut1,optimizedOut2;
 TCHAR bugsText[16], *bugs=_T("This function has bugs!");
 _tcscpy(bugsText,bugs);
}
在这个函数中,bugsText缓冲区的长度不能接收bugs字符串。不必要的变量optimizedOut1和optimizedOut2在调试版本中会保护堆栈内容不被破坏,但这些变量在发布版本中会被去掉。导致的结果是,缓冲区的溢出会破坏堆栈的函数返回地址,从而发布版的程序会崩溃,而在调试版中不会。一般的,被优化的变量不会这么明显。
12.最好为你的可执行程序创建调试符号,并将得到的PDB文档存档,即使程序属于发布版本。
13.为程序的某个版本创建调试符号,要对程序所对应的Visual C++项目做如下的设置:
 (1) 打开工程设置对话框,在Setting...对话框中选择所需的版本(如:Win32 Release)。
 (2) 在工程控制树里,通过单击根节点选择整个工程。
 (3) 在C/C++标签里选择General类。在调试信息里,如果是发布版本则选择Program Database,如果是调试版本则选择Program Database for Edit and Continue(注意:编辑继续选项与优化连接不相容,而且它还增大可执行文件的长度,从而不适合于发布版本)。
 (4) 在Link标签里选择Debug类。然后选择Debug info和Microsoft format选项。记住不要选择Separate types选项,这样所有的调试信息才会被合并到单独的一个PDB文件中。另外,如果你需要做事后调试的映射文件时,记住要选择Generate Mapfile选项。
 (5) 对于发布版本,选择Link标签,在Project Options对话框的最后加上“/OPT:REF”。这个选项使得不被引用的函数和数据不会出现在可执行文件中,从而避免了文件无畏的增大。对于调试版本不要使用这个选项,因为它会关闭增量链接(incremential linking)
 (6) 使用Rebuild All命令重新编译整个工程。
注意:如果你发现带有调试符号的可执行文件比不带调试符的可执行文件大许多,很有可能你忘记了加上/OPT:REF链接选项。
14.为了进一步控制调试,要使用反汇编代码窗口进行代码的调试
15.最好不要使用Separate types选项,除非你要在一个非常慢的计算机上编连非常大的工程。
16.可以在观察窗口中显示TIB(thread information block)结构,使用@TIB,并在程序中添加如下代码:
 #ifdef _DEBUG
 #include "tib.h"
 PTIB pTIB
 #endif
在观察窗口中通过pTIB=@TIB来查看TIB内容。
17.使用Autoexp.dat
18.在Windows2000里设置系统调用断点:
 (1) 确定包含API函数的模块。
 findstr MessageBox win32api.csv
 (2) 确定模块对应的调试符号已装载
 (3) 确定真正的函数名
 dumpbin -symbols user32.dbg | findstr MessageBox
     返回“_MessageBoxA@16”。如果调试符号没有被装载,使用命令:
 dumpbin -exports user32.dll | findstr MessageBox
     返回“MessageBoxA”,注意,“MessageBox”只会被预处理器看到,它会将名字转换为“MessageBoxA”或“MessageBoxW”,“A”代表ANSI,而“W”代表宽字符或Unicode。
 (4) 在断点对话框里设置断点。如果调试符号被装载了,输入
     {,,user32.dll}_MessageBoxA@16
     如果调试符号没有被装载,输入
     {,,user32.dll}MessageBoxA
     如果调试符号没有被装载,你还需要在选项对话框的Debug标签里设置Load COFF&Export选项。这个选项允许你在没有调试符号的情况下,在输出函数上设置断点。
  注:如果没有findstr.exe工具,可以使用Visual C++ 的 Find in Files命令。
19.如果返回值不大于32位,可在观察窗口键入“@EAX”查看,如果返回值长为64位,其低32位会放在EAX中,高32位放在EDX中。如果返回值大于64位,会在EAX中放入指向返回值的指针,可以通过在观察窗口中进行类型转换,例如:若返回一个CRect,则可以键入“(CRect*)@EAX”显示结果,或在内存窗口的Address栏中直接键入EAX查看返回值。
20.使用API函数GetAsyncKeyState帮你调试WM_MOUSEMOVE消息。
21.使用Spy++调试与消息有关的问题。
22.使用回调帮助你调试Windows代码:回调允许你进入Windows看它在做些什么。
23.PostMessage和SendMessage的区别: PostMessage只负责将消息放到消息队列中,不确定何时及是否处理SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
24.可以使用X86的内存对齐规则来确定一个指针是否有效。堆栈、堆的指针都是双字对齐的,所以,它们的最后一位应该是十六进制的0、4、8、C。当X86指令可以是任何大小,所以指令指针的最后一位可以是任何数字。函数是16字节对齐,所以函数指针的最后一位应该总是零。
25.要发现对已被释放的内存的访问操作,一定要将被释放的指针置为空。

Windows驱动调试 windbg双机调试 阅读详情

相关推荐

【UEFI】Windows下调试UEFI程序

【UEFI】Windows下调试UEFI程序

Suweet的博客 2679

Windows调试技巧&工具

Windows上的一些debug技巧和工具

刘国元的专栏 1978

IDA远程动态调试(linux & Windows)

本篇文章参考 “逆向界圣经”《加密与解密》(第四版) ida作为强大的静态分析工具其实也兼具动态分析功能,我们下面给出教程。 首先明确,我们要把我们的物理机作为调试器客户端,在其上运行的虚拟机作为目标文件的运行环境。 其次我们还需要在虚拟机里面运行相应的调试服务器组件(处理所有底层执行和调试操作),调试服务器组件可以在ida安装目录下的dbgsrv文件中找到,不同系统需要选择不同的组件传到虚拟机中。 接下来给出服务器组件接受的命令行参数: “-p端口”:用于设置备用TCP端口,以便服务器进行监听。默.

m0_46296905的博客 1万+

Windows驱动调试方法

我们按照上一篇文章中的步骤,在被调试机中运行驱动,可以看到Visual Studio就中断在了KdBreakPoint()函数处,此时可以进行单步调试。我们按照上一篇文章中的步骤,在被调试机中运行驱动 ,WinDbg中断在了KdBreakPoint()函数处,此时可以进行单步调试。表示所使用网络的端口,这里使用的50000(建议范围是49152至65535,这样能最大程度的避免与已使用的端口有冲突)在重启过程中,被调试机器会主动连接设置的50000端口,连接成功后,界面会输出以下内容。

【微软MVP】zhaotianff的专栏 3199

Windows系统高级调试技术指南

本文还有配套的精品资源,点击获取 简介:《Windows高级调试》书籍深入讲解了Windows环境下高效、精确的问题排查技术。涵盖从基础调试概念到高级内存分析、线程同步问题、驱动程序调试等领域,强调使用调试工具(如WinDbg、KD、CDB等)进行代码跟踪、性能分析和内存泄漏检测。书中还深入讨论了Windows内部工作机制、线程同步、内存管理等,并重点介绍了驱动程序调试和内...

weixin_30415591的博客 1360

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

调试技巧(windows环境)

Debug通常称为调试版本,便于程序员调试程序。Release称为发布版本,便于用户使用。Debug包大小大于Release。因为Debug包含调试信息,不作任何优化使用Vs时Release模式(可能)不能调试。

nigulasihjznskn的博客 277

从零开始STM32cubeide学习

使用的是正点原子的精英版,单片机是STM32F103ZET6,详细讲解完成跑马灯实验

weixin_44077208的博客 2280

Windows 调试工具入门-2-基本调试操作

一、  调试器命令窗口 1、 简介     使用Windows 调试工具进行调试,大部分和调试器之间的交互都是通过调试器命令 窗口来进行的。命令的输入、输出都是在调试器命令窗口中显示出来。对WinDbg 来说, 调试器命令窗口是名为”Command”的窗口;对于KD、CDB 和NTSD 来说,整个命令行窗 口就是调试器命令窗口。这里主要介绍WinDbg 中的调试器命令窗口。

eqera的专栏 2118

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 764

暑期实习前端面试笔试总结汇总

腾讯2020暑期实习——前端视频面试(1)回顾 腾讯2020暑期实习——前端视频面试(2)回顾 腾讯2020暑期实习——前端视频面试(3)回顾 腾讯2020暑期实习——前端视频面试(4)回顾 蘑菇街2020暑期实习——前端视频面试回顾 二、笔试 奇安信前端实习笔试总结 vivo笔试(2020年3月8日) ...

明媚 3065

windows高级调试

无论用户模拟异常还是CPU异常,经过前面分析,在经过记录之后,最终都会经过KiDispatchException这个派发函数中。在KiDispatchException中会对CPU异常和用户异常分别进行处理。

LIJIWEI0611的博客 1681

一维光子晶体态密度计算与应用解析

态密度(DOS)是凝聚态物理和光子学中的核心概念,描述了量子态在能量空间的分布规律。基于麦克斯韦方程组的周期性介电结构分析表明,一维光子晶体通过布拉格散射形成光子带隙,其态密度曲线呈现典型的范霍夫奇点和禁带特征。这种特性使光子晶体在光学工程中具有重要价值,特别是在滤波器设计和传感器开发领域。通过转移矩阵法等数值计算手段,可以精确预测带隙位置和宽度,其中折射率对比度与周期数是关键设计参数。实际应用中,1550nm通信波段滤波器常采用Si/SiO2交替结构,而引入缺陷层则能产生高Q值缺陷模。计算优化时需注意数值

weixin_36487018的博客 193

《windows高级调试》

《windows高级调试》深入揭示windows高级调试技术 1.泄漏诊断工具 内存泄露检测工具比较

haimianjie2012的专栏 1226

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

Systemcall名屋 2979

AOSP 8.0.0编译中的ANDROID_DATA缺失问题解决方案

在AOSP编译过程中,环境变量和路径设置的正确性至关重要。遇到相关的错误时,检查并修正环境配置通常是解决问题的关键。希望本文提供的分析和解决方案能帮助你顺利编译AOSP。

m0_74337424的博客 398

Windows 调试工具课程

本文是我在集团内部上的课程记录而成的博客内容。在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路。适合于伙伴们入门 Windows 调试本文内容的组织方式是按照原本课程课件里面的一页页的内容组装而来的方式组织的,在过程中补充一些讲课时的内容本次课程里面核心的内容是调试工具,调试工具是我们在调试软件的时候的利器,通过调试工具我们可以找到软件的问题,解决软件的问...

dotNET跨平台 495

Orange3实战教程:文本挖掘---主题建模

主题建模通过LDA、LSI或HDP算法分析文档集合,自动发现隐含主题结构。组件输入为文档语料库,输出包括带主题权重的语料库、主题词分布及完整主题数据。不同算法特性各异:LSI允许正负权重但解释性较弱,LDA更易解释,HDP参数复杂需谨慎设置。结果可结合词云、热力图等可视化工具分析主题特征及分布。示例显示如何通过预处理文本、选择算法(如提取5个LDA主题),并利用MDS和箱线图探索主题间关系及关键词分布。

err2008的专栏 362

书评——Windows高级调试

书评——Windows高级调试 本文地址:http://www.cnblogs.com/AndersLiu/archive/2009/07/04/book-review-advanced-windows-debugging.html 作者:Anders Liu 调试,是通过尝试运行程序找到问题根源的过程。这和测试不同,测试是发现问题的过程,但不深究问题产生的位置、原因。调试是...

weixin_30607659的博客 95

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

调试 Windows 中的调试

调试 Devcpp中调试 进入cmd命令提示行,输入再回车即可使用调试: PATH=Dev-Cpp安装路径\Dev-Cpp\MinGW64\bin;%PATH% 调试 Devcpp中调试 Windows专用命令{ cmd(打开) exit(关闭) cd{后加 1.\文件夹名 2. …(后退一个文件夹) 3.文件名(前进打开文件) } type 打印 dir 列出 del 删除 } 通用编译命令...

qq_45718756的博客 336

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Windows BLE调试工具

Windows BLE调试工具 【下载地址】WindowsBLE调试工具 本仓库提供了一个用于Windows平台的BLE调试工具资源文件。该工具旨在帮助开发者和工程师在Windows环境下进行BLE(蓝牙低功耗)设备的调试工作。通过使用此工具,用户可以更方便地测试和调试BLE设备的连接、数据传输等功能 ...

gitblog_09763的博客 706

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

windows调试

1.Windows跟踪语句: (1)TRACE(_T(“Warning (FunctionName):Object %s not found.\n”),objectName); 在输出的调试窗口会输出结果。跟踪信息输出到输出窗口output window中。[调试版本中使用] (2)C++的C运行时刻库函数跟踪语句        ANSI C 运行时刻库函数没有跟踪语句,但是V

sha_jinhao的专栏 823

Windows内核以及驱动调试

写在前面的话 笔者的文章环境 物理Win10 + VMware® Workstation 16 Pro + 虚拟Winxp + 虚拟Win7 + 虚拟Win10+VS2019+wdk10 widnows xp winxp因为微软以及不提供支持了,所以服务器上并找不到符号表 推荐使用下面的方案: 链接:https://pan.baidu.com/s/1RfHUyE6vXrau_Cvf1Zlnew 提取码:ao9r vmware windgb \\.\pipe\com1 winxp multi

、moddemod 950

[windows服务]windows服务的调试

调试windows服务的方法:1.改造windows服务为普通程序,像普通程序一样调试。2.直接调试跟踪windows服务程序,此方法的调试过程如下:windows服务的调试方法和我们一般的程序方法有些不一样,但是也是在IDE里面调试。MS的IDE也为我们考虑到了这些方面。跟我来看看怎样来调试一个windws服务吧? 大致分为一下几个步骤:1. 建立windows服务程序,不管你是用w

迭代生活,程序人生 1710

调试windows服务

调试服务 在调试配置中生成你的服务。 安装你的服务。 从 “服务控制管理器”、“服务器资源管理器”或代码启动服务。 使用管理凭据启动 Visual Studio,那么你就能附加到系统进程。 (可选)在 Visual Studio 菜单栏上,选择“工具”、“选项” 。在“选项”对话框中,选择“调试”、“符号”,选择“Microsoft...

weixin_30383279的博客 347
上一篇: WINDOWS 2K Dll 加载过程
下一篇: sprintf,你知道多少?
sjf331
博客等级 码龄25年 46粉丝 37原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值