测试c ++应用程序的性能时不一致的行为

时间:2014-03-21 18:39:22

标签: c++ exception performance-testing xerces-c

我有一个c ++应用程序可以进行身份​​验证。这个场景就像测试它可以在15分钟的时间段内完成的最大数量的身份验证。所以在使用名为&#的性能测试软件在四核计算机上测试其性能时34;加载亚军",我正面临一个问题

我遇到了很多异常,我正在捕捉它们但是困难的是,我无法找到该异常的类型。为了模拟Load runner行为,我编写了一个多线程程序并进行了并行验证,这次为了找到异常的来源我删除了通用catch块并让应用程序崩溃,我还将windbg配置为postmortem debugger。因此,应用程序崩溃并在堆栈跟踪中发现它崩溃了"的xerces" dll(我使用的xml解析器)。所以现在我知道了异常的类型,我试图通过使用这些catch块来捕获这些异常

    catch (const XMLException& toCatch)
    {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "xerces exception :" << message;           
        XMLString::release(&message);
        return -1;
    }
    catch (const DOMException& toCatch) 
    {
        char* message = XMLString::transcode(toCatch.msg);
        cout <<"xerces DOMexception :" << message; 
        XMLString::release(&message);
        return -1;
    }

但它仍然是通用的catch块,我试过&#34; bad_alloc&#34; (也只是试一试),它也没有抓住它。

我遵循xerces给出的线程安全建议。但我仍然得到这些例外。令我困惑的是,这个例外的类型到底是什么?这甚至都有类型吗?

编辑:我可以看到我的应用程序崩溃在xerces dll中,因为它是第三方dll我不知道我能做些什么来修复它。每次崩溃后,Windbg会报告这样的事情

FAULTING_IP: 
xerces_c_3_1_vc80!xercesc_3_1::DOMImplementationRegistry::getDOMImplementation+31
120e2681 8b30            mov     esi,dword ptr [eax]

EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 120e2681       (xerces_c_3_1_vc80!xercesc_3_1::DOMImplementationRegistry::getDOMImplementation+0x00000031)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000000
Attempt to read from address 00000000

在这种情况下我该怎么办?你们推荐什么?

1 个答案:

答案 0 :(得分:0)

您发布的例外似乎是访问冲突(0xc00000005)。除非在构建应用程序时打开了结构化异常处理(SEH),否则C ++异常将无法捕获这些异常。

但另一个问题是你知道异常是什么,所以你如何解决它?这完全是另一回事。从它的外观来看,xerces代码试图取消引用NULL指针。

你应该有一个方便的可调试版本的xerces库(附带完整的源代码),并尝试使用该版本复制崩溃。那么至少你可以准确地看到碰撞位置发生了什么以及它是如何发生的。

相关问题