大战一个奇怪的bug

初窥事实

经测试,我的个人管理程序在自己的电脑上运行正常,但是在其他电脑上运行会出现严重错误,导致无法正常登录,报错类型为

未将对象引用设置到对象的实例

该错误成因复杂,并发类型多,排查难度大。
动手排除前,经商讨,确定bug最大的可能成因是我将创建注册表表项的函数写在了 Main.cs 里,而登录系统需要读取项引发的此异常。
确定解决办法:将 Main.cs 内的103行加密代码转移到 Login.cs 内。
注意:bug类型与解决还有JIT信息我都会放在文末。


齐天巨石

确定了错误的成因后,我于上午10时40分开展代码转移,转移结束之后,打开虚拟机(Win10),载入程序。

启动程序,输入初始账号与密码,点击登录。


此时我认为是 Main.EncryptByDES(string srcString) 出现错误(JIT 第二行提示),于是我便展开了对加解密的重构。


误入歧途

转到函数定义,我发现问题在于没有解密解密密钥(其实已经解密了,纯眼缺没看到),于是我就再一次调用了 Decode.AutoDecode (string secretKey)方法进行解密。
此时我认为大功告成,于是打包程序,放入虚拟机,执行。


讲真我感觉脑袋里面轰的响了一声,托JIT(实时调试器)与dnSpy的福,我终于找到了问题所在,我进行了两次解密,导致字符串的格式化出现了问题。
于是我只得把二次解密删掉,又恢复到了"未将对象引用设置到对象的实例"状态。


山重水复

我准备先放下这个错误,手动建立注册表项 HKEY_LOCAL_MACHINE\SoftWare\SysNode64\METHODBOX
登录,然 后 开 幕 雷 击。


我:???不过还是托JIT的福,检查出是读取金钱时的文件问题,改为0即可修复。
然后修改密码:

梅 开 二 度 这个bug的原因我至今没查出来,可能也是因为注册表的问题?
最后检查软件注册功能。

三 阳 开 泰
不过这个bug没什么修复的必要,仅仅是因为我的虚拟机没网而已。


极 限 闪 回

对bug的研究似乎已经进入了绝境。
似乎只有一种可能,就是注册表问题。
搜索注册表:METHODBOX


至此,bug成因找到。


柳暗花明

经过多次实验,判断写入时无法创建,于是我出了损招,写入一个test解决问题。
所以说,最复杂的问题,也许就是最简单的问题。


具体解决信息:

解决了如下严重错误:

"未将对象引用设置到对象的实例"。

此bug的导致原因是无法创建指定注册表项,具体起源于另一个未知的bug,推测可能在加密方面。

解决方案,添加代码
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\METHODBOX", "iTest", "True");强制创建项。

"输入数据不是完整的块"。

在解决bug中起源的另外一个bug,原因为错误的重复解密。发生在EncryptByDes(string srcString)函数中。
将语句

string desKey = DeCode.DecodeKey((string)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\METHODBOX", "DES", "None")); //解码

误写为

string desKey = DeCode.DecodeKey((string)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\METHODBOX", "DES", "None")); //解码
desKey = DeCode.DecodeKey(desKey)

导致了错误。

"向一个无法连接的网络尝试了一个套接字操作"。

软件激活时引发的bug。具体代码位于Welfare.textBox1_TextChanged(object sender, EventArgs e)

HttpClient client = new HttpClient();
var values = new Dictionary
{
    { "code", textBox1.Text },
};
var content = new FormUrlEncodedContent(values);
 var response = await client.PostAsync("http://120.27.239.120:8505/jivt/VerifyCode", content);
var responseString = await response.Content.ReadAsStringAsync();
code = responseString.Split(':')[1].Split(',')[0];

引发原因是用户无网络,该bug并不致命,所以无需修复。

"输入字符串的格式不正确"。

在软件启动时莫名引发的错误,错误点在于Main.Main_Load(object sender, EventArgs e)函数中,第667至第672行,具体语句为

StreamReader moneyInput = new StreamReader(Application.StartupPath + "\\Files\\Money.txt");
string moneyPath = moneyInput.ReadToEnd();
string moneyTruth = DecryptByDes(moneyPath);
moneyTruth = DecryptByDes(moneyPath);
money =  Convert.ToDouble(moneyTruth);
uiLabel10.Text = moneyTruth; //显示金钱

引发原因为\Files\money.txt是一个空文档,写入0即可解决问题。


最后附上JIT调试文本:

System.NullReferenceException: 未将对象引用设置到对象的实例。

在 MethodBoxLivingAccount.DeCode.DecodeKey(String srcCode) 位置 C:\Users\Administrator\source\repos\MethodBox Living Account\MethodBoxLiving Account\MethodBox Living Account\DeCode.cs:行号 16

在 MethodBoxLivingAccount.Main.DecryptByDes(String encryptedStr) 位置 C:\Users\Administrator\source\repos\MethodBox Living Account\MethodBox Living Account\MethodBox Living Account\Main.cs:行号 714

在 MethodBoxLivingAccount.Login.uiButton1_Click(Object sender, EventArgs e) 位置 C:\Users\Administrator\source\repos\MethodBox Living Account\MethodBox Living Account\MethodBox Living Account\Login.cs:行号 95

在 System.Windows.Forms.Control.OnClick(EventArgs e)

在 Sunny.UI.UIButton.OnClick(EventArgs e)

在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

在 System.Windows.Forms.Control.WndProc(Message& m)

在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)***

MethodBox Living Account © 2021 MethodBox Studio

你可能感兴趣的:(大战一个奇怪的bug)