Vb6 对于没有源代码的随机崩溃的应用程序,我们能做些什么?

Vb6 对于没有源代码的随机崩溃的应用程序,我们能做些什么?,vb6,vbscript,crash,Vb6,Vbscript,Crash,我试图帮助客户解决一个问题,但我已经没有主意了。他们有一个定制的、内部编写的应用程序,可以按计划运行,但它崩溃了。我不知道这样有多久了,所以我想我无法将崩溃追溯到任何特定的软件更新。最不幸的是,包含逻辑核心的VB6 DLL不再有任何源代码 此VB6 DLL由来自VB脚本的2-3个函数调用启动。显然,我可以修改VB脚本来添加错误日志记录,但是我没有太多机会获得高质量的信息来查明崩溃的根源。我已经将日志消息放在所有函数调用的任一侧,并确定是哪个调用导致了崩溃。但是,err对象中不会返回任何内容,因为

我试图帮助客户解决一个问题,但我已经没有主意了。他们有一个定制的、内部编写的应用程序,可以按计划运行,但它崩溃了。我不知道这样有多久了,所以我想我无法将崩溃追溯到任何特定的软件更新。最不幸的是,包含逻辑核心的VB6 DLL不再有任何源代码

此VB6 DLL由来自VB脚本的2-3个函数调用启动。显然,我可以修改VB脚本来添加错误日志记录,但是我没有太多机会获得高质量的信息来查明崩溃的根源。我已经将日志消息放在所有函数调用的任一侧,并确定是哪个调用导致了崩溃。但是,err对象中不会返回任何内容,因为调用正在崩溃wscript.exe

我不确定我还能做什么。有什么想法吗

编辑:我关心的主要原因是,尽管我没有源代码,但可能有一些外部因素导致崩溃凭据不足、文件锁定等。我检查了由于wscript.exe崩溃而在drwtsn32.log中创建的日志文件,我得到的唯一信息是访问冲突


<>我首先倾向于认为这与安全权限有关,但这也不能是内存访问违规吗?

取决于应用程序的范围,您的客户端可能需要考虑重写。没有源代码,当其他事情发生变化时,它们最终会被迫这样做。

取决于应用程序的范围,您的客户端可能需要考虑重写。如果没有源代码,当其他内容发生变化时,他们最终将被迫这样做。

总是可以直接在运行崩溃应用程序的PC上或内存转储上使用调试器来确定发生了什么。在本例中,代码是VB6,这可能没有多大帮助,因为您只能在Win32级别获得有用的信息


最终,如果您没有源代码,那么找出bug的真正位置会有帮助吗?除非您可以在调用脚本中永远避免该代码路径,否则您将无法修复它。

始终可以直接在运行崩溃应用程序的PC上或在内存转储上使用调试器来确定发生了多少情况。在本例中,代码是VB6,这可能没有多大帮助,因为您只能在Win32级别获得有用的信息

最终,如果您没有源代码,那么找出bug的真正位置会有帮助吗?除非您可以在调用脚本中永远避免该代码路径,否则您将无法修复它。

您可以使用。这可能会帮助您查明错误,但如果没有来源来修复它,将不会对您有多大好处

更懒散的方法是从代码而不是脚本调用dll,这样您至少可以看到导致问题的原因并检查err对象。您仍然无法修复它,除非问题是它被错误地调用。

您可以使用。这可能会帮助您查明错误,但如果没有来源来修复它,将不会对您有多大好处

更懒散的方法是从代码而不是脚本调用dll,这样您至少可以看到导致问题的原因并检查err对象。你仍然无法修复它,除非问题是它被错误地调用。

的那个家伙有一个非常有趣的系列,关于构建一个在线扑克机器人,它充满了严肃的技术信息,其中很多都是关于如何进入现有的应用程序并弄乱它们,从某种意义上说,你想做什么

具体来说,他有,一对一。这些技术可能有助于发现、解决或修复崩溃,尽管我想这仍然是一个艰难的决定。

的家伙有一个非常有趣的系列,关于构建一个在线扑克机器人,它充满了严肃的技术信息,其中很多都关心如何进入现有的应用程序并搞乱它们,这就是,在某种程度上,你想做什么

具体来说,他有,一对一。这些技术可能有助于发现、解决或修复崩溃,尽管我想这仍然是一个艰难的任务。

为机器添加最大可能的RAM

这个简单而廉价的黑客在过去对我很有用。当然,YMMV。

将最大可能的RAM添加到机器中


这个简单而廉价的黑客在过去对我很有用。当然,YMMV.

如果你真的认为这是一个环境问题,比如文件权限,你可以考虑使用其中一个工具。我曾经使用Filemon来计算我的应用程序所涉及的所有文件,并通过这种方式发现了一个问题

你可能还想做一个
使用快速检查是否正常,以确保实际加载了您认为正确的DLL文件。我看到错误的C运行时版本被加载并导致一个神秘的崩溃。

如果你真的认为这是一个环境问题,比如文件权限,你可以考虑使用其中一个工具。我曾经使用Filemon来计算我的应用程序所涉及的所有文件,并通过这种方式发现了一个问题


您可能还需要对进行一次快速的健全性检查,以确保实际加载了您认为是的DLL文件。我看到加载了错误版本的C运行时并导致了一个神秘的崩溃。

访问冲突几乎总是一个内存错误-在这种情况下更可能是因为其随机崩溃权限可能更明显地可复制。对于dll,它可以是

dll本身的代码中有一个错误-可能是内存分配错误,甚至是简单的循环边界条件错误

当dll尝试链接到系统上的另一个dll时出错。这通常是由计算机上dll版本之间的不匹配引起的

您的第一步应该是尝试获得可再现的碰撞条件。如果您没有一组会使系统崩溃的情况,那么您无法知道何时已修复它

然后,我会将系统安装在一台干净的机器上,并尝试在该机器上重现错误。运行监视器,精确检查程序崩溃时DLL等打开的其他文件。我见过在超线程奔腾上崩溃的代码,但在早期的奔腾上没有,因此将旧机器恢复为测试台可能是一个很好的选择。改变机器中的ram数量也是值得的

希望这些步骤能给你一个线索。希望这将是一个环境问题,因此可以通过使用正确版本的windows、dll等来避免。但是,如果此时您仍然被崩溃所困扰,没有好的线索,那么您可以选择重写或尝试通过在汇编程序级别调试dll或分解dll来进一步查找问题。如果您不熟悉汇编代码,那么这两种方法都是很长的一段时间,很难看出您将获得什么,而且任何一种方法都可能会造成大量的时间消耗。我自己过去也曾遇到过这样一个特别低水平的高强度问题,比如在一个“招聘编码员”网站上刊登广告,并寻找具有专业知识的人。同样,要做到这一点,您需要一个可再现的错误


从长远来看,没有源代码的dll将不得不被替换。聘请具有装配技能的专家分析功能并提供流程图可能是值得考虑的。最好的商业实践是以可控的方式尽早完成这项工作,而不是晚些时候——比如在它运行的机器崩溃之后,该版本的windows不再容易使用。

访问冲突几乎总是一个内存错误——在这种情况下,更可能是因为其随机崩溃权限可能更大显然是可复制的。对于dll,它可以是

dll本身的代码中有一个错误-可能是内存分配错误,甚至是简单的循环边界条件错误

当dll尝试链接到系统上的另一个dll时出错。这通常是由计算机上dll版本之间的不匹配引起的

您的第一步应该是尝试获得可再现的碰撞条件。如果您没有一组会使系统崩溃的情况,那么您无法知道何时已修复它

然后,我会将系统安装在一台干净的机器上,并尝试在该机器上重现错误。运行监视器,精确检查程序崩溃时DLL等打开的其他文件。我见过在超线程奔腾上崩溃的代码,但在早期的奔腾上没有,因此将旧机器恢复为测试台可能是一个很好的选择。改变机器中的ram数量也是值得的

希望这些步骤能给你一个线索。希望这将是一个环境问题,因此可以通过使用正确版本的windows、dll等来避免。但是,如果此时您仍然被崩溃所困扰,没有好的线索,那么您可以选择重写或尝试通过在汇编程序级别调试dll或分解dll来进一步查找问题。如果您不熟悉汇编代码,那么这两种方法都是很长的一段时间,很难看出您将获得什么,而且任何一种方法都可能会造成大量的时间消耗。我自己过去也曾遇到过这样一个特别低水平的高强度问题,比如在一个“招聘编码员”网站上刊登广告,并寻找具有专业知识的人。 同样,要做到这一点,您需要一个可再现的错误


从长远来看,没有源代码的dll将不得不被替换。聘请具有装配技能的专家分析功能并提供流程图可能是值得考虑的。以可控的方式尽早完成这项工作是一种很好的商业实践,就像它所运行的机器崩溃后,windows版本不再容易获得一样。

有一些工具可能会有所帮助。首先,您可以使用dependency walker为您的应用程序创建运行时配置文件:

有一个profile菜单,您可能希望确保选中follow child processes选项。这将做两件事。首先,它将允许您查看所有被引入的lib版本。这有助于解决某些问题。其次,运行时配置文件在运行子进程时使用调试内存管理器。因此,您将能够看到缓冲区是否正在溢出,以及一些关于这方面的信息

另一个有用的工具是Mark Russinovich的过程监控:

此工具将报告所有文件、注册表和线程操作。这将帮助您确定是否遇到文件或注册表凭据问题

Process explorer为您提供了许多相同的信息:

这也是俄罗斯的一个工具。我发现通过这个工具查看一些数据更容易一些


最后,使用windows或dev studio的调试工具可以让您了解错误发生的位置。

有几个工具可能会有所帮助。首先,您可以使用dependency walker为您的应用程序创建运行时配置文件:

有一个profile菜单,您可能希望确保选中follow child processes选项。这将做两件事。首先,它将允许您查看所有被引入的lib版本。这有助于解决某些问题。其次,运行时配置文件在运行子进程时使用调试内存管理器。因此,您将能够看到缓冲区是否正在溢出,以及一些关于这方面的信息

另一个有用的工具是Mark Russinovich的过程监控:

此工具将报告所有文件、注册表和线程操作。这将帮助您确定是否遇到文件或注册表凭据问题

Process explorer为您提供了许多相同的信息:

这也是俄罗斯的一个工具。我发现通过这个工具查看一些数据更容易一些


最后,使用windows或dev studio的调试工具可以让您了解错误发生的位置。

您可能想尝试使用您可能有幸反编译内部应用程序。它可能不会为您提供完整的源代码,但至少可能会提供有关应用程序正在执行的操作的更多信息,这也可能有助于您确定自己的CulPit。

您可能想尝试使用,但您可能有幸反编译内部应用程序。它可能不会为您提供完整的源代码,但至少可能会提供有关应用程序正在执行的操作的更多信息,这也可能有助于您确定自己的CulPit。

反向工程是一种可能性,尽管是一种困难的可能性。 理论上,您可以反编译,甚至调试/跟踪已编译的VB6应用程序-这是简单的部分,在没有源代码的情况下修改它是困难的部分,但在最简单的情况下除外

免费编译器/反编译器:


在大多数情况下,重写将是解决问题的更成功、更快的方法

逆向工程是一种可能性,尽管难度很大。 理论上,您可以反编译,甚至调试/跟踪已编译的VB6应用程序-这是简单的部分,在没有源代码的情况下修改它是困难的部分,但在最简单的情况下除外

免费编译器/反编译器:


在大多数情况下,重写将是解决问题的更成功、更快的方法

尝试寻找工具来对DLL进行反向工程?我几乎可以肯定他们曾经存在过。。。或者,如果可能的话,只重写崩溃的函数,并让他们谈谈源代码管理的重要性:-我试图对DLL进行反向工程,但我能得到的只是类和函数名。客户端确实不知道函数中发生了什么。我有一个不错的主意,但我无法知道所有的细节。那么,你最终明白了吗?您是否在不同的环境中尝试过它?是否尝试找到对DLL进行反向工程的工具?我几乎可以肯定他们曾经存在过。。。或者,如果可能的话,只重写崩溃的函数,并让他们谈谈源代码管理的重要性:-我试图对DLL进行反向工程,但我能得到的只是类和函数名。客户端确实不知道函数中发生了什么。我有一个不错的主意,但我无法知道所有的细节。那么,你最终明白了吗?你是不是换了件衣服
租房环境?这里的人是多么纯粹,我总是感到惊讶。我提出了一条实用的建议,也许能以一种简单而廉价的方式解决这个问题。但人们更喜欢重写、逆向工程等。就个人而言,如果有什么东西表明这是一个内存不足的错误,我只会对它投入更多的内存。是的,从时间上讲,这比重写或其他任何东西都要便宜,但从问题描述来看,修复内存的几率非常低,在我看来……这里的人是多么纯粹,这总是让我感到惊讶。我提出了一条实用的建议,也许能以一种简单而廉价的方式解决这个问题。但人们更喜欢重写、逆向工程等。就个人而言,如果有什么东西表明这是一个内存不足的错误,我只会对它投入更多的内存。是的,从时间上讲,这比重写或其他任何东西都要便宜,但是从问题描述来看,修复它的内存量非常少,在我看来……系统内部工具对于这类事情非常有用。猜测和破解debuggerSysinternals工具之间的一个很好的中间点对于这类事情来说是非常好的。猜测和破解调试器之间的一个很好的中间环节