Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#以编程方式强制调试模式_C#_Debugging - Fatal编程技术网

c#以编程方式强制调试模式

c#以编程方式强制调试模式,c#,debugging,C#,Debugging,不管人们为什么要这样做,我只是好奇是否能做到 以下是我的代码,它不起作用: if (!Debugger.IsAttached) { try { Debugger.Launch(); while (!Debugger.IsAttached) { Thread.Sleep(1000); } } catch (System.Security.SecurityException e)

不管人们为什么要这样做,我只是好奇是否能做到

以下是我的代码,它不起作用:

if (!Debugger.IsAttached)
{
    try
    {
        Debugger.Launch();
        while (!Debugger.IsAttached)
        {
            Thread.Sleep(1000);
        }
    }
    catch (System.Security.SecurityException e)
    {
        Console.WriteLine("exception " + e.Message);
    }
}

基本上,我很想知道如何使用
Debugger.Launch()
方法。

它将启动并向进程附加一个调试器。 当然,不要在生产中使用它。我认为那是可能的用途
当发生错误时,可以在本地计算机中,并且您希望自动运行调试。

我认为您误解了
调试器.Launch()
的功能。它的功能类似于硬编码断点

当您的程序点击调试器.Launch()时,将显示实时调试窗口(假设您的计算机上安装了Visual Studio)。此时,您的程序将停止-它不会继续运行

如果选择VS的实例,它将被启动,并将在使用
Debugger.Launch()
的行中停止,就像您在那里遇到断点一样

因此,while()循环实际上是没有理由的。只要想停止程序查看某些内容,就可以调用
Debugger.Launch()


但是
Debugger.Launch()
的实用性是值得怀疑的。你可以更容易地使用断点,并且使用断点不会有意外地将其留在成品中的危险。

Debugger.Launch将启动调试器,或者如果已经附加了调试器,则不会执行任何操作。我相信它不是断点。Debugger.Break()实际上会破裂

调用Debugger.Launch()可能会根据机器的不同执行不同的操作,例如是否安装了Visual Studio等


另请参阅一篇相关的科技文章:

您的问题不清楚。您能更详细地描述一下您想要做什么吗?我的目标是以编程方式启动调试器,即将调试器附加到通过进程本身运行的进程。这实际上对我来说非常有效。我无法在完成任务后立即将调试器附加到进程t启动(甚至使用gflags、vsjitdebugger和windbg)。这不仅为我启动了VS调试器,还触发了一个立即断点。它还发现了PDB,手动附加到进程时(即使设置了正确的路径),由于任何原因都找不到PDB。谢谢!@PerryC,很高兴它能帮上忙。接下来,根据它的实现方式:,我认为我没有必要检查Debugger.IsAttached,因为它已经在后台检查了。所以一个Debugger.Launch()调用应该足够靠近程序的入口点,后续断点应该就是Debugger.Break().From msdn on Debugger.Launch()-“启动一个调试器并将其附加到进程。”也许您认为是Debugger.Break()?根据他的回答,我想西蒙·穆里埃会支持我的。@user420667:不-我没有阅读文档。我编写了一个快速的单行应用程序来测试它。如果在VS下运行,它的行为就像断点一样。但是如果在VS之外启动,它的行为与我描述的完全相同。我们的机器可能会根据不同的情况运行在不同的VS组件上安装或诸如此类,但这些都是我得到的结果。奇怪的是,当我在VS 2008 express和VS 2008中运行它时,它不会强制停止(在调试模式或非调试模式下启动)。只有Debugger.Break()当我运行它时,强制停止,当它处于调试模式时。当我在VS 2008中运行它时,Debugger.Launch()会提示异常,并要求启动调试器。这适用于VS2008。我甚至在VS之外编译了代码(使用csc.exe)因为我有一大堆小的测试脚本。我不想每个测试脚本都有一个单独的项目,但如果出现问题,我想在VS中进行调试。我只是将调试器.Launch()放入这对于服务启动很有帮助,因为它不需要在代码中放置等待,这样您就可以附加调试器。通常,这只是在我们的代码中,直到我们想要调试该部分,而不是在服务启动时竞相附加它。这对MV也很有用C应用程序启动时,因为我的断点在启动后才会被击中。很酷,我必须仔细阅读那篇文章。不过我现在意识到,因为我使用的是VS Express,它通常没有“附加到进程”命令,就像其他visual Studio一样,它可能不适合我。不幸的是,该链接并没有完全满足我的要求,但它是一个很好的技巧,可能会派上用场。@学生-谢谢注意。我已经更新了链接。谢谢你的建议,但我认为它实际上并没有附加到我的流程中。也许这是因为我使用的visual studio express.VS express不包含JIT调试器。