初窥事实
经测试,我的个人管理程序在自己的电脑上运行正常,但是在其他电脑上运行会出现严重错误,导致无法正常登录,报错类型为
未将对象引用设置到对象的实例
该错误成因复杂,并发类型多,排查难度大。
动手排除前,经商讨,确定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