GVKun编程网logo

Visual Studio:ContextSwitch死锁(vs调试死锁)

21

关于VisualStudio:ContextSwitch死锁和vs调试死锁的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于C++从VisualStudio项目中的所有文件中运行一个cpp文

关于Visual Studio:ContextSwitch死锁vs调试死锁的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于C ++从Visual Studio项目中的所有文件中运行一个cpp文件 Projects and Solutions in Visual Studio、c# – 我可以在Visual Studio中为UnitTest / LoadTest创建一个自定义的TestContext定时器吗?、Gitea Extension for Visual Studio 1.0.36 发布、Gitea Extension for Visual Studio 1.0.73 发布等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Visual Studio:ContextSwitch死锁(vs调试死锁)

Visual Studio:ContextSwitch死锁(vs调试死锁)

我收到了我无法解决的错误消息。它源自Visual Studio或调试器。我不确定最终的错误情况是在VS,调试器,我的程序还是数据库中。

这是Windows应用程序。不是网络应用。

VS发出的第一条消息是一个弹出框,上面显示:“没有为任何调用堆栈框架加载任何符号。无法显示源代码。” 单击该按钮后,我得到:“
检测到ContextSwitchDeadlock ”,以及下面复制的一则长消息。

该错误出现在向下扫描DataTable的循环中。对于每一行,它将表中的键(HIC#)值用作SqlCommand的参数。该命令用于创建返回一行的SqlDataReader。比较数据。如果检测到错误,则将一行添加到第二个DataTable。

该错误似乎与过程运行多长时间(即60秒后)有关,而不是与发现多少错误有关。我不认为这是内存问题。循环内未声明任何变量。唯一创建的对象是SqlDataReaders,它们位于Using结构中。添加System.GC.Collect()无效。

该数据库是同一台便携式计算机上的SqlServer站点。

表单上没有精美的小玩意或小工具。

我不知道此过程中的任何事情与我之前数十次所做的事情有很大不同。我之前已经看过错误,但是从来没有看到一致的错误。

有什么想法吗?

完整错误文本:
60秒钟以来,CLR无法从COM上下文0x1a0b88过渡到COM上下文0x1a0cf8。拥有目标上下文/公寓的线程很可能要么执行非泵送等待,要么处理很长时间运行的操作而不泵送Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。为避免此问题,所有单线程单元(STA)线程都应使用泵送等待原语(例如CoWaitForMultipleHandles),并在长时间运行的操作中定期泵送消息。

答案1

小编典典

ContextSwitchDeadlock并不一定意味着你的代码中有一个问题,只是有一个潜在的。如果转到Debug >Exceptions菜单中并展开Managed DebuggingAssistants,则会发现ContextSwitchDeadlock已启用。如果禁用此选项,则当项目需要很长时间才能处理时,VS将不再发出警告。在某些情况下,您可能会有效地长时间运行。如果您正在调试并且在处理过程中停在一条线上,这也很有用-
在您有机会深入探讨问题之前,您不希望它抱怨。

C ++从Visual Studio项目中的所有文件中运行一个cpp文件 Projects and Solutions in Visual Studio

C ++从Visual Studio项目中的所有文件中运行一个cpp文件 Projects and Solutions in Visual Studio

基于文件创建一个可执行文件,其中的主要文件包含main()函数(以通常接受的形式)。如果您可以创建这样的主要功能,则实际上可以创建这样的可执行文件,但是恐怕它不会做您想要的事情:您可以编辑问题并向我们解释您想要实现的目标吗? (我可能会相应地编辑答案)

,

否,您应该将它们放在单独的项目中。 Visual Studio不是为运行单文件C ++脚本而构建的。

Projects and Solutions in Visual Studio

...从逻辑上讲,项目包含所有编译为可执行文件,库或网站的文件。

项目旨在将用于构建,调试,链接,运行等的所有源代码和配置保存在单个可执行文件/库中。不要害怕有很多项目。我有一个像您一样长期运行的解决方案,其中包含许多单文件一次性项目。

c# – 我可以在Visual Studio中为UnitTest / LoadTest创建一个自定义的TestContext定时器吗?

c# – 我可以在Visual Studio中为UnitTest / LoadTest创建一个自定义的TestContext定时器吗?

我的一些单元测试有一个在循环中定义的睡眠.我不仅要描述测试的每次迭代,而且要对所有迭代的整体时间进行分析,以显示任何非线性缩放.例如,如果我概述“整体”,它包括睡眠的时间.我可以使用秒表开始/停止,使其只包括doAction().但是,我不能将Stopwatch结果写入TestContext结果.
[TestMethod]
    public void TestMethod1()
    {
        TestContext.BeginTimer("Overall");
        for (int i = 0; i < 5; i++)
        {
            TestContext.BeginTimer("Per");
            doAction();
            TestContext.EndTimer("Per");
            Sleep(1000);
        }
        TestContext.EndTimer("Overall");
    }

看来TestContext可以被继承和重新定义.但是,我没有看到任何有关如何写回到事务存储的示例.

有没有实现这个我可以参考,还是另一个想法.我想在Visual Studio为LoadTest提供的同一报告中看到它.否则我必须写我自己的报告.

此外,我已经尝试嗅探将这些写入到LoadTest数据库的sql,但没有成功地找出如何.应该有SPROC呼叫,但我认为是测试结束时的所有数据.

解决方法

那我也有类似的问题.我想在Visual Studio中的最终测试结果中报告一些额外的数据/报告/计数器,我找到了一个解决方案.

首先,这不能用你正在尝试的方式来完成.在TestContext存在的负载测试和单元测试之间没有直接的连接.

第二,你必须了解visual studio如何创建报告.它从OS的performance counters收集数据.您可以编辑这些计数器,删除不需要的计数器,并添加所需的其他计数器.

如何编辑计数器

负载测试配置有两个关于计数器的基本部分.这些是:

>柜台.这些是一组计数器,例如默认添加的代理.如果打开这个计数器,你会看到它收集计数器,如内存,处理器,Physicaldisk e.t.c.因此,在测试结束时,您可以看到所有代理商的所有数据.如果您想为此计数器添加更多计数器,您可以双击它(从加载测试编辑器,请参见下图),然后选择添加计数器.这将打开一个带有系统所有计数器的窗口,并选择所需的计数器.
>计数器集映射.在这里,您将计数器与您的机器相关联.默认情况下,[CONTROLLER MACHINE]和[AGENT MACHInes]添加了一些默认计数器.这意味着映射到[CONTROLLER MACHINE]的计数器组中包含的所有计数器将从控制器机器收集.同样适用于所有代理商.

您可以添加更多的计数器集和更多的机器.右键单击计数器集映射 – >管理计数器集…新窗口打开如下:

如您所见,我已经添加了名为db_1的额外机器.这是机器的计算机名称,它必须与控制器位于同一个域,才能访问并收集计数器.我也把它标记为数据库服务器并选择了sql计数器集(默认为sql计数器,但您可以编辑它,并添加任何您想要的计数器).现在每次执行此负载测试时,控制器将转到计算机名为db_1的计算机,并收集将在最终测试结果中报告的数据.

现在的编码部分

好的,在这个(大)介绍之后,现在是时候看看如何将你的数据添加到最终的测试结果中.为此,您必须创建自己的custom performance counters.这意味着必须在收集这些数据的机器中创建一个新的Performance Counter Category.在你的情况下,在所有的代理中,因为这是执行单元测试的地方.

在代理程序中创建计数器后,您可以编辑如上所示的代理计数器集,并选择额外的自定义计数器.

以下是有关如何执行此操作的示例代码.

首先为所有代理商创建性能计数器.在每个代理机器上运行此代码一次(或者您可以在load test plugin中添加):

void CreateCounter() 
{
    if (PerformanceCounterCategory.Exists("MyCounters"))
    {
        PerformanceCounterCategory.Delete("MyCounters");
    }

    //Create the Counters collection and add your custom counters 
    CounterCreationDataCollection counters = new CounterCreationDataCollection();
    // The name of the counter is Delay
    counters.Add(new CounterCreationData("Delay","Keeps the actual delay",PerformanceCounterType.AverageCount64));
    // .... Add the rest counters

    // Create the custom counter category
    PerformanceCounterCategory.Create("MyCounters","Custom Performance Counters",PerformanceCounterCategoryType.MultiInstance,counters);
}

在这里你的测试代码:

[TestClass]
public class UnitTest1
{
    PerformanceCounter OverallDelay;
    PerformanceCounter PerDelay;

    [ClassInitialize]
    public static void ClassInitialize(TestContext TestContext)
    {
        // Create the instances of the counters for the current test
        // Initialize it here so it will created only once for this test class
        OverallDelay= new PerformanceCounter("MyCounters","Delay","Overall",false));
        PerDelay= new PerformanceCounter("MyCounters","Per",false));
        // .... Add the rest counters instances
    }

    [ClassCleanup]
    public void CleanUp()
    {
        // Reset the counters and remove the counter instances
        OverallDelay.RawValue = 0;
        OverallDelay.EndInit();
        OverallDelay.RemoveInstance();
        OverallDelay.dispose();
        PerDelay.RawValue = 0;
        PerDelay.EndInit();
        PerDelay.RemoveInstance();
        PerDelay.dispose();
    }

    [TestMethod]
    public void TestMethod1()
    {
         // Use stopwatch to keep track of the the delay
         Stopwatch overall = new Stopwatch();
         Stopwatch per = new Stopwatch();

         overall.Start();

         for (int i = 0; i < 5; i++)
         {
             per.Start();
             doAction();
             per.Stop();

             // Update the "Per" instance of the "Delay" counter for each doAction on every test
             PerDelay.Incerement(per.ElapsedMilliseconds);
             Sleep(1000);

             per.Reset();
         }

         overall.Stop();

         // Update the "Overall" instance of the "Delay" counter on every test
         OverallDelay.Incerement(overall.ElapsedMilliseconds);
     }
}

现在,当您的测试执行时,他们会向计数器报告他们的数据.在负载测试结束时,您可以在每个代理机器中看到计数器,并将其添加到图形中.将以MIN,MAX和AVG值报告.

结论

>我认为(经过几个月的研究),这是将测试中的自定义数据添加到最终负载测试报告的唯一方法.
>可能看起来太难了.那么,如果你明白这一点,那就不难做到优化了.我已经将这个功能包装在一个类中,以便更容易地进行初始化,更新和管理计数器.
这是非常有用的.我现在可以从我的测试中看到统计信息,这是不可能的默认计数器.当我们对网络服务的Web请求失败时,我可以抓住错误并更新适当的计数器(例如,超时,服务不可用,请求拒绝…).

我希望我能帮忙.

总结

以上是小编为你收集整理的c# – 我可以在Visual Studio中为UnitTest / LoadTest创建一个自定义的TestContext定时器吗?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Gitea Extension for Visual Studio 1.0.36 发布

Gitea Extension for Visual Studio 1.0.36 发布

Gitea Extension for Visual Studio 1.0.36 发布了,改进内容包括:

  • 增加了可以创建和发布版本库到组织

  • 增加了链接和登录按钮在链接部分的显示.

  • 删除了在.Gitea 文件中保存密码并从Credential Manager.获取账户密码

  • 现在开始保存最终路径在.Gitea 文件中

  • 修复其他一些BUG

    Thanks !troygeiger

  • 增加了 ”动态“链接

  • 改进了一部分翻译内容

Gitea Extension for Visual Studio 1.0.73 发布

Gitea Extension for Visual Studio 1.0.73 发布

很高心的宣布新版本发布,

1、修正了Gitea URL在子目录时无法登陆的问题。感谢  MokhamedDakhraui 的反馈。 

2、项目DLL的优化和项目加载优化

源码地址: https://gitee.com/maikebing/Gitea.VisualStudio

下载地址: https://marketplace.visualstudio.com/items?itemName=MysticBoy.GiteaExtensionforVisualStudio

或者在 VS 扩展库里搜索 Gitea Extension for Visual Studio  即可 

今天关于Visual Studio:ContextSwitch死锁vs调试死锁的分享就到这里,希望大家有所收获,若想了解更多关于C ++从Visual Studio项目中的所有文件中运行一个cpp文件 Projects and Solutions in Visual Studio、c# – 我可以在Visual Studio中为UnitTest / LoadTest创建一个自定义的TestContext定时器吗?、Gitea Extension for Visual Studio 1.0.36 发布、Gitea Extension for Visual Studio 1.0.73 发布等相关知识,可以在本站进行查询。

本文标签: