2018-9-20-断点调试-Windows-源代码
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
断点调试 Windows 源代码
|
lindexi
|
2018-09-20 17:37:55 +0800
|
2018-05-11 20:18:58 +0800
|
VisualStudio 调试
|
本文来告诉大家如何使用断点的方式,在 PotPeek 工具的反编译看到报告的异常。
这个方法对于 DUMP 调试比较有用,可以知道是在哪个函数哪一句抛出的异常。
首先先让软件出现一个异常,那么最简单的异常就是跨线程访问主线程
在 页面写一个依赖属性,然后在另一个线程设置这个属性
public MainWindow()
{
InitializeComponent(); new Thread(() =>
{
TowbiboujeJerexakipa = "123"; }).Start();
} public static readonly DependencyProperty TowbiboujeJerexakipaProperty = DependencyProperty.Register(
"TowbiboujeJerexakipa", typeof(string), typeof(MainWindow), new PropertyMetadata(default(string))); public string TowbiboujeJerexakipa
{
get { return (string) GetValue(TowbiboujeJerexakipaProperty); }
set { SetValue(TowbiboujeJerexakipaProperty, value); }
}
按一下运行就可以看到下面的异常,但是大家想知道这个异常是在底层哪里抛出的?
如果这时在我的设备,可以看到调用堆栈,我双击一下就可以进去代码
想知道我是怎么做的就继续看博客,不想知道的就点关闭页面
下载微软代码
打开 https://referencesource.microsoft.com/ 可以看到 Download 点击进入就可以看到这个界面
自己需要什么版本就下载什么版本,不过我是把所有的版本都下载,然后创建 git 管理,这样需要哪个版本就可以快速切换
调试文件
但是下载好的文件,VisualStudio 怎么知道他需要从哪里找?虽然 VisualStudio 可以添加人工智能告诉你怎么写代码才有坑,但是他也不知道你下载的文件会放在哪。
通过右击解决方案,点击属性,可以看到可以设置源代码
我就把我下载的源代码解压到 God 文件夹的 source 文件夹,也就是图片最后一行,我就这样添加了代码。
这时 VisualStudio 就会尝试去这里寻找源代码。不过不要想着这样就可以像我一样快速调试源代码,还需要另一个工具
DotPeek
打开 DotPeek ,如果还没下载,那么请到官网下载
或者到我上传的 CSDN 下载 dotPeek 查看源代码-CSDN下载
在我的调试 ms 源代码 已经有告诉大家如何调试 ms 源代码,但是没有告诉大家如何做到断点调试,直接看到微软源代码是哪里异常
符号服务器
打开 dotpeek 符号服务器,打开和使用方法请看调试 ms 源代码
加载代码
如果发现 dotpeek 的加载的代码太少了,如没有找到 WindowsBase 就需要在 GAC 添加代码
点击 OpenFromGAC 就可以在 GAC 寻找代码,如果需要调试 WPF 代码,那么 WindowsBase 是必须添加的
加载符号
这时很多小伙伴都关闭了符号加载,因为打开符号加载,开始调试需要等很久,如果大家有缓存自己的符号,那么调试加载符号还是很快的。
如果开始没有加载符号,在调试就需要打开点击工具 调试-> 窗口->模块
如果看到自己没有加载符号,就需要右击这个模块,点击加载符号
这时点击了就可以去喝咖啡,因为需要等待 dotpeek 创建符号,打开 dotpeek 可以看到进度,是非常慢的
除了WindowsBase还需要添加 PresentationCore ,如果自己的 PotPeek 没有,请自己添加
下面是需要检查的代码
mscorlib
System
System.Core
System.Xml
System.Xaml
WindowsBase
PresentationCore
PresentationFramework
找到符号
有时候发现虽然已经按照我说的做了,还是无法进入堆栈代码,而且弹出了这个选项,让你去找文件
这时就需要使用 dotpeek 找到对应的代码,然后导出工程
在对应的代码右击,选择导出工程
如果自己有导出,那么把这个工程添加到设置源代码
断点调试
如果已经看到了这里,请不要说我写了这么久还没说到主题,刚才只是准备,现在开始就是断点调试
点击调试->新建断点,例如下面需要调试 PenContext.InitStylusPointDescription 函数,就需要在断点写入 类名.函数名
这个函数在第一次触摸时触发,所以使用这个断点就可以在第一次触摸进去
运行程序,如果在断点可以看到一个红色的点,表示这个断点是可以进去
如果看到一个黑点,表示这个断点无法进入,这时尝试加载符号,需要注意,必须要使用 dotPeek 符号服务器才可以加载,这时需要开着 dotpeek 只要加载第一次符号,之后加载还是很快
这时试试触摸一下,就可以看到跳转到这个函数
下面就可以高兴对这个类的函数进行断点,但是不是全部语句都可以添加断点,因为调试的源代码是 Release 会优化很多代码。
简单的调试
如果这时为了调试简单的代码,还可以使用 dnspy 调试,使用这个调试十分快。
首先下载 dnSpy,这个软件需要区分 x86 和 x64 选择自己需要调试的程序的平台,运行。
首先拖入已经编译好的 exe 到 dnspy
然后点击拖入的 exe 点击运行就可以调试这个 exe 了,但是这里是告诉大家如何调试源代码,首先寻找到需要调试的代码
还是告诉大家如何调试 PenContext.InitStylusPointDescription ,因为我知道 PenContext 在哪,于是我就一级级展开,找到 InitStylusPointDescription 函数,在这个函数按下 F9 没错,他的快捷键和 VisualStudio 差不多,这时按下 F5 调试程序
在使用这个软件还可以在自己的代码断点,然后按 F11 进入微软框架代码查看他是怎么做的。
虽然我告诉了大家这些方法用来断点调试,但是我无法说大家一定可以使用我的方法看到源代码,有一些源代码是无法拿到的,有一些是没有符号。
看到这里大家是否好奇为什么我在调试 InitStylusPointDescription ? 因为我的 WPF 在一个特殊的屏幕点击就会崩溃,我拿到了 Dump ,看到了托管异常
我使用了 dnspy 定位了堆栈,然后远程调试,加载了符号,进入源代码查看了这个函数
我发现是在这一行代码崩溃的
StylusPointPropertyInfo pointPropertyInfo = new StylusPointPropertyInfo(new StylusPointProperty(guid, false), iMin, iMax, (StylusPointPropertyUnit) iUnits, flResolution);
我进入了 StylusPointPropertyInfo 构造函数
很快就看到抛异常的代码
if (maximum < minimum)
throw new ArgumentException(MS.Internal.PresentationCore.SR.Get("Stylus_InvalidMax"), nameof (maximum));
这里 maximum 是 0xFFFFFFFF 因为这里是 int 判断,最大值 -1 所以返回 false ,在 usb 论坛找到工具
发现是插入屏幕描述符是错的,所以就让硬件去修改。
2018-9-20-断点调试-Windows-源代码的更多相关文章
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
常量,字段,构造方法 常量 1.什么是常量 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
- Windows下Lua+Redis 断点调试环境搭建==Linux下类似
Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio, ...
- PHPstudy + phpstrom +xdebug 断点调试(windows) - CSDN博客
原文:PHPstudy + phpstrom +xdebug 断点调试(windows) - CSDN博客 php.ini 配置 需要添加如下内容 [XDebug]xdebug.profiler_ou ...
- 史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置
在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体验,非常简略的介绍和对比了几款常用的集成开发环境,就我个人而言,比较推崇 Zend Studio 和 PhpS ...
- [转]史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置
本文转自:https://www.cnblogs.com/lishiyun19/p/4470086.html 在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体 ...
- 调试 Hadoop 源代码
环境是 64bit Ubuntu 14.04 系统, jdk 1.7 以及 Eclipse Mars (4.5) 这里介绍两种调试 Hadoop 源代码的方法: 利用 Eclipse 远程调试工具和打 ...
- 【译】使用 Visual Studio 调试外部源代码
您是否曾经需要调试并进入依赖于 NuGet 或 .NET 库的代码,而这些库并没有构建为您的解决方案的一部分? 现在,调试它们并不像调试作为解决方案一部分的项目那么容易.从 Visual Studio ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...
- 在ASP.NET 5项目中使用和调试外部源代码包
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于在ASP.NET 5中,项目依赖都是通过"包"来引用,所以使用 ...
随机推荐
- 《2019上半年DDoS攻击态势报告》发布:应用层攻击形势依然严峻,海量移动设备成新一代肉鸡
2019年上半年,阿里云安全团队平均每天帮助用户防御2500余次DDoS攻击,与2018年持平.目前阿里云承载着中国40%网站流量,为全球上百万客户提供基础安全防御.可以说,阿里云上的DDoS攻防态势 ...
- 一文纵览EMAS 到底内含多少阿里核心技术能力
申请阿里云EMAS,体验一站式移动研发平台,更多精彩尽在开发者会场 EMAS的整体定位是阿里巴巴移动技术对外输出的主窗口,沉淀了阿里巴巴近10年在移动互联网技术架构上的积累以及在一系列垂直场景中所实践 ...
- Codeforces 439C
题目链接 比赛时间没能通过==, 只能说明自己代码写的太不严谨咯! 解题思想就是贪心 先判断无解的情况: 1. 奇数不够,因为偶数是无法凑成奇数的 2. 偶数不够,2个奇数可以凑成一个偶数 3. 在奇 ...
- 【To Read】
Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...
- Directx11教程(14) D3D11管线(3)
原文:Directx11教程(14) D3D11管线(3) 现在我们开始学习一些CP(command processor)的知识.参考资料: http://fgiesen.wordpres ...
- Directx11教程(7) 画一个颜色立方体
原文:Directx11教程(7) 画一个颜色立方体 前面教程我们通过D3D11画了一个三角形,本章我们将画一个颜色立方体,它的立体感更强.主要的变动是ModelClass类,在Model ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- [框架]eclipse搭建ssm框架 一 标签: eclipsetomcat框架 2017-03-25 21:28 1085人阅读 评论(
虽然现在也做过一些项目,但是自己从头搭起来的框架几乎没有,所以这两天自己搭了一下ssm的框架,下面写一下框架的搭建过程.并且给出增删改查四条线来方便大家熟悉代码. 环境准备 maven3.2.3 ec ...
- yum install mysql-devel
linux系统在装mysql相关的包时要先装mysql-deval,这个包包含mysql的相关配置和环境组件 执行yum install mysql-deval
- Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题
1:如果调用的子进程也是一个python脚本,则subprocess.Popen中的bufsize=1无效果.也就是说,即使设置了bufsize=1表示进行行缓冲,子进程如果不显示调用sys.stdo ...