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中,项目依赖都是通过"包"来引用,所以使用 ...
随机推荐
- pytest fixture 利用 params参数实现用例集合
@pytest.fixture有一个params参数,接受一个列表,列表中每个数据都可以作为用例的输入.也就说有多少数据,就会形成多少用例.如下面例子,就形成3条用例 test_parametrizi ...
- Jeff Dean 光辉事迹
这是Google 2007年的愚人节笑话,罗列了很多Jeff Dean的“光辉事迹”.大名鼎鼎的Jeff Dean想必不用我介绍了.……好吧,还是介绍一下,Jeff Dean是Google最早的一批员 ...
- 【JZOJ3824】【NOIP2014模拟9.9】渴
SLAF 世界干涸,Zyh认为这个世界的人们离不开水,于是身为神的他要将他掌控的仅仅两个水源地放置在某两个不同的城市.这个世界的城市因为荒芜,他们仅仅保留了必要的道路,也就是说对于任意两个城市有且仅有 ...
- Directx11教程(32) 纹理映射(2)
原文:Directx11教程(32) 纹理映射(2) 在写代码之前,我们先制作一个dds文件.从网上找到了一张照片,处理成为512*512,保存为jpg格式. 启动微软的directx ...
- Hdu 4810
2014-05-02 15:53:50 题目连接 2013年南京现场赛的题目,现场的时候,排在我们前面的队伍基本都过了这题,我们后面的队伍也有不少过了这题,唯独我们没有.. 后来是Qingyu Sha ...
- 【Leetcode链表】旋转链表(61)
题目 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: ...
- Dom4j(Dom for Java) Day24
TestDomForJava.java package com.sxt.dom4j; import java.io.File; import java.util.Iterator; import ja ...
- mySQL start service失败终极解决办法
start service失败 原因是电脑没删干净.具体1.先卸载2.计算机“搜索”所有MySQL文件 注意隐藏文件也可以搜索出来全部删除.3.清除注册表MySQL及子项.4.防火墙的问题 不要勾 ...
- jQuery学习笔记之解除重复点击事情重复绑定
问题:有不同的按钮点击后都执行相同的事件,在jQuery重复点击就会产生事件重复绑定. 解决方法:使用unbind("click")方法,每次点击都先接触绑定已有事件再绑定新对象. ...
- 异常处理之try catch finally
package com.sxt.wrapper.test2; /* 0418 * 异常处理 * 采用异常处理的好处:保证程序发生异常后可以继续执行 * e.printStaceTrace:打印堆栈信息 ...