我如何确定VB6(或5)应用程序无法启动的原因?因此,我无法附加调试器。我可以使用IDA Pro免费软件,但需要一些指示,从哪里开始。
我没有这个程序的源代码,只有.exe。当我说它没有启动时,我双击.exe,没有任何反应 - 没有进程继续运行 - nadda。
在admin下运行会创建三个空文件夹,然后在显示UI之前以静默方式退出。 OllyDbg告诉我有一个'不精确的浮点结果',但我需要花几个小时或几天学习解释OllyDbg给我的所有信息。我在Advanced Windows Debugging的书也应该在周一或周二到达。
答案 0 :(得分:12)
您是说该程序启动但崩溃才可以附加?如果是这样,请尝试在调试器下启动该程序。
在Visual Studio中,您可以通过转到
来完成此操作答案 1 :(得分:11)
我似乎对此做了很多回答,但请尝试查看Windows事件日志。这里经常有一些信息非常有用,比如一个控件,或者你的程序依赖于未找到的dll。
答案 2 :(得分:9)
首先,查看Dependency Walker,它会告诉您应用程序是否缺少任何DLL。
其次,可执行文件的名称是什么?尝试将其重命名为MYDUMMY.EXE并再次运行它。有些名称不起作用,因为它们已在使用中。我曾经帮助过一位新的程序员,他一直试图让他的第一个应用程序运行两周。它被称为DISPLAY.EXE,它已经是一个Windows模块,所以它不会加载。
答案 3 :(得分:5)
您是否尝试在cmd shell中运行它以查看它是否将任何数据返回到控制台?是否创建了任何日志文件?
即使你没有连接调试器,因为程序没有启动,你可以从调试器中启动它,OllyDbg将允许你这样做,任何其他值得他们的调试器也是如此。之后,您可以尝试调试代码首先没有启动的原因。
答案 4 :(得分:4)
我会使用SysInternals进程监视器,特别是遵循Case of the Unexplained研讨会视频中的一些建议。
在启动之前开始监控(一切),然后在您认为错误时停止监控,这应该在几秒钟内完成。然后,您将获得所有进程中发生的所有事件的详细日志。您可以搜索您的进程名称,并找到不成功的内容,例如可能没有权限,或者从系统获取其他未向用户报告的其他投诉,因为您没有在一般错误陷阱中编码一个对话框。好吧,也许即使你有它由于某种原因无法显示对话框。并且进程监视器日志将告诉您它。
这就像在一堆日志记录中没有编码的自动日志记录。
答案 5 :(得分:3)
如果没有源代码,您可能没有太多运气,但您可以查看this tip on MSDN以自动启动调试器。它有点笨拙,但适用于任何程序。我相信,表现良好的C ++应用程序停在主要位置。它可以成为早期错误的救星。
答案 6 :(得分:3)
好吧,就像dlamblin提到的那样,我会从sysinternals中获取ProcExp,FileMon和RegMon,并将它们设置为监视此过程,然后尝试启动它。您将无需获得有关以下其中一项的信息:
如果做不到这一点,请抓住免费的VBDecompiler,看看这个东西在它的启动代码中做了什么,可能会引导你到某个地方......如果你抛出异常,他们就有了
:Err
键入标签,该标签可能会掉线,并在没有任何警告的情况下退出,或任何其他内容......
我使用的VBDecompiler名为“setup_free-VBDecompiler.zip”。你可以谷歌它找到它,现在甚至可能有更好的版本。但是,不要指望它反编译成原始的源代码,它只能使它成为“最佳猜测”,但至少让你超越这个障碍可能很方便....小心,谨慎/尊重任何可能阻止 ANY 逆向工程的EULA ......
如果此信息有任何帮助,请告诉我。如果你仍然无法到达任何地方,请与我联系,并将.exe发送给我,我可以在我的Norman Sandbox中运行它,这可能会给我们更多关于函数调用的信息,以及应用程序尝试做什么...
答案 7 :(得分:1)
在Sub Main
中,您应该确保有On Error Goto
声明。机会是被抛出而未被抓住的例外。尝试写入错误处理程序中的日志文件,看看你得到了什么。
答案 8 :(得分:1)
我会说获取OllyDbg的副本并查看应用程序何时/为何决定终止。
答案 9 :(得分:1)
尝试检查事件日志中是否有相关消息。
使用Filemon检查应用程序是否尝试访问任何文件(没有配置?让我们退出而不显示错误消息..)
http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx
我相信有类似的程序可以查看应用程序尝试使用注册表执行的操作。
答案 10 :(得分:1)
您可以编写一个简单的入门程序,在 dwCreationFlags 参数中使用CREATE_SUSPENDED标志调用CreateProcess()。
它将启动您调试的程序,其线程将立即冻结。然后你可以附上。
主程序可能会等半分钟,然后调用ResumeThread()。到那时你将附加调试器。
答案 11 :(得分:1)
1。)如果你有MS Visual Studio 2005,它允许在命令行上运行它,如下所示:
devenv.exe is the executable(mostly in installation path e.g.(C:\Program Files\Microsoft Visual Studio 8\Common7\IDE)
运行devenv.exe --help它给出了命令行选项 我为您的案例找到了一些相关选项:
devenv.exe / debugexe
打开要调试的指定可执行文件。该
命令行的其余部分传递给它
可执行文件作为其参数。
希望有所帮助。
-AD
答案 12 :(得分:0)
使用WinDBG,您可以使用“Open Executable”(或者只是做一个windbg {可执行文件名},以便在ntdll启动过程中立即连接到调试程序,并在获取代码并开始运行之前在断点处停止那里(类型'g')应该提供有关问题的一些信息。
答案 13 :(得分:0)
另一个想法是,尝试在Windows 98或Windows 2000的兼容模式(右侧,属性,兼容性选项卡)中运行。
同时为“Everyone”提供对程序正在创建此文件夹的文件夹的完全访问权限
答案 14 :(得分:0)
'不精确的浮点结果'有时(很少,但发生在我身上)指向(浮动)数字表示的问题 - 就像程序尝试在内部解析一些硬编码字符串并假设小数总是按句点分隔或类似于某些类似
尝试更改系统区域设置或仅使用数字或货币格式(十进制和千位分隔符)。