[成功]又逮到M$的BUG——十六进制模式下NumericUpDown错误解析,无痛修补!
作者:V君 发布于:2020-4-16 13:47 Thursday 分类:折腾手记
这次遇到的问题是在 WinForms 中使用 NumericUpDown 空间的十六进制模式时,若输入了大于 7FFFFFFF 的值之后,控件会把值非预期地变为 0 的情况。
TL;DR
- 引入 NuGet 包「Lib.Harmony」
- 把这个文件搬入项目中
- 调用 DoPatch 方法
这样不用改变任何现有实现,问题就解决啦!
现在你可以出去了(pia
如果还有时间,可以听我扯扯
最近在折腾一个参数设置的页面,需要填入一系列16、32位的十六进制数值,为了方便操作我就选择了 NumericUpDown 控件。首先将值范围设置成 0 到 65535(0xFFFF) 和 4294967295(0xFFFFFFFF)然后愉快地拿去用了。但是没有想到调试过程中发现了这个问题,起初以为是粘贴的值有空格导致拒绝接受,又尝试手打还是不行,摸索发现是超过 7FFFFFFF 就会触发。
进入解决问题的模式,先在咕狗上查找解决方案,然后就找到了继承并重写的方式。嗯问题的原因找到了,是 WinForms 控件的实现有 BUG,问题也解决了,既然咕狗能找到解决方案,那就不要发表内容重复文章污染互联网!(当时我压根没想过要发表出来
然鹅,这种方式并不适用于所有情况,比如对于封装了原生控件的界面库,就不能使用继承并重写的方式了,比起魔改 DLL 或者找到库源代码改掉,然后驮着到处跑,还是寻找另一种路子来解决这个问题吧。
一个鬼点子冒出来:能不能把跑起来之后把方法替换掉?这样无论是直接使用还是封装使用的情况,统统都把这个问题解决掉。又是一阵咕狗,然后就找到了 Harmony 库,如其名「和谐」,解决 BUG 于无形之中,达到不用修改现有实现、无痛修补代码的目的。
其实这是 monkey patch …通过嗅探标准输入输出来了解VisualGDB烧录操作
作者:V君 发布于:2020-4-12 13:55 Sunday 分类:折腾手记
这篇文章主要面向的是和我一样不熟悉 GDB 的人,请已经熟练使用 GDB 的老鸟不要笑,或者来看看我是怎样嗅探标准输入输出的也还凑合吧。
最近用起 VisualGDB 之后,总算从 Keil 的地狱中逃出生天,开发过程的确是很爽了。然而,如果仅仅是程序烧录到单片机也要装一个 VS 带上 VisualGDB,还得拿到源代码?很显然实际量产不应该这么做,理想的方式应该是将编译后的程序用烧录工具刷入单片机。
好奇心使我对这个过程产生了兴趣,从调试器适配的时候提示下载 OpenOCD 能看出 VisualGDB 是透过它来调用 ST-LINK 的,进一步又发现 OpenOCD 的另一边由 GDB 来操作。命令行参数可以用 Procexp 轻松获得,但进程启动之后的就全都是通过标准输入输出流来操作 GDB 了。
因为使用 GDB 是个过于庞大的课题,就懒得去学了,短时间内也不会用得顺手吧(如果懂得如何使用 GDB 的话还用得着 VisualGDB 么?
想知道 VisualGDB 如何操作 GDB 来烧录程序。首先去咕狗找找标准输入输出的捕获方法,不断换关键字兜了几圈回来没有一点收获,甚至一点线索都没有。
一拍脑袋,那就搞个透明代理来记录双向传递的内容吧。于是就写了个简单的标准输入输出流嗅探工具,还上传了一个直接可用的二进制文件,将原来的 EXE 改名扩展名前面增加 -real,例如 GDB.EXE 改成 GDB-real.EXE 然后用嗅探工具冒充它,启动之后就会在旁边产生名为 GDB.EXE.stdio-sniff.yyyymmdd-HHmmss-fff.log 的文本文件,将命令行参数、标准输入、标准输出、错误输出记录到里面。
这样问题就解决了——原来烧录要用 GDB 的 load 命令。
然后进一步尝试离开 VS 环境独立运行,将 OpenOCD 和 GDB 以及编译好的程序搬到一台没有环境的机器,装好 ST-LINK 驱动,按照嗅探来的操作走一波,嗯嗯,吼!现在离开 VS 环境也能烧录了!
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)