调试由另一个exe运行的exe

5

最近我接手了一个项目,但不确定上一个开发人员是如何进行调试的... 我有两个可执行文件,其中一个最终会运行另一个。 我将它们称为exe1exe2。这些是用C#创建的,我使用Visual Studio 2015。

运行exe1很好。它做了一些事情,并最终启动了exe2exe2最终出现错误。它正在写入我的日志文件:

BaseException:System.NullReferenceException: Object reference not set to an instance of an object.

(我通常可以解决这个错误。我敢肯定这只是一个创建对象或其他问题,但我的试错方法到目前为止都没有起作用。)

我没有exe1的源代码,因此无法编写超级程序来完成所有操作(这将允许我进行调试)。是否有一种方法可以设置断点并逐步跟踪exe2的操作?

我应该补充说明,exe2需要exe1的运行。 exe1执行一堆操作,没有它,exe2将立即崩溃。


当exe2启动时,您能否附加调试器? - Wai Ha Lee
我不知道在Visual Studio中调试已编译的可执行文件的方法。但是,您可以使用众多工具之一(我使用Telerik的JustDecompile)来查看exe2中的源代码。 - Tim
@WaiHaLee 我不熟悉那个过程。那是 Visual Studio 的一个功能吗? - coinbird
1
https://msdn.microsoft.com/en-us/library/3s68z0b3.aspx - Wai Ha Lee
3个回答

4
Visual Studio多年来一直允许调试子进程。我尝试过在父进程和子进程的代码中使用它,效果很好。不确定你是否只有exe2程序的代码,但我认为值得尝试。将exe1设置为项目的调试目标,启用子调试,并查看是否会在exe2中触发断点...

1

既然您拥有exe2的代码,您可以在代码中添加Debugger.Launch(),这将停止程序并允许您在该行代码处附加调试器。

您可以将其作为main方法的第一行添加,以确保您在启动时立即捕获它。


这是一个有趣的工具。我添加了 Debugger.Launch()。你如何实际步进代码?当 VS 弹出时,它会显示“应用程序处于中断模式。您的应用程序已进入中断状态,但没有代码可显示,因为所有线程都在执行外部代码(通常是系统或框架代码)。” - coinbird
请确保您正在运行调试代码(而非发布代码),当您打开Visual Studio时,它应该会带您到具有debugger.launch的代码行。如果您正在运行多个线程,可以使用Visual Studio线程窗口在它们之间切换。 - John Koerner
此外,根据您的调试设置(仅我的代码、调试 .Net Framework 代码等),您可能会深入到框架代码中。您可以使用堆栈跟踪窗口返回到您的代码。 - John Koerner
调试模式如何工作?我构建发布版本以创建exe2。一旦调试器弹出,我没有看到任何更改为调试模式的选项。我能够点击继续到达我遇到的错误点,所以这是一个好兆头,我想。 - coinbird

1

有两种方法可以解决这个问题。

1. 使用John在上面给出的答案中提到的Debugger.Launch()

public static void Main(string[] args)
            {
                Debugger.Launch();

                //Rest of your code 
            }

这将允许您附加到正在运行的Visual Studio或启动一个新实例。

2. 当前一种方法不起作用时,另一种方法是在代码开头放置一个循环来检查是否已附加调试器,这将给您足够的时间来执行“附加到进程”方法。

public static void Main(string[] args)
{
    while(!Debugger.IsAttached)
    {
        Thread.Sleep(1000); //Sleep 1 seconds and check again.
    }

    //Rest of your code  
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接