【发布时间】:2014-03-21 18:39:22
【问题描述】:
我有一个执行身份验证的 c++ 应用程序。该场景就像测试它可以在 15 分钟这样的时间段内执行的最大身份验证次数。因此,在使用名为“Load”的性能测试软件在四核机器上测试其性能时Runner”,我遇到了问题
我遇到了很多异常,我正在捕捉它们,但困难的部分是,我找不到该异常的类型。所以为了模拟 Load runner 行为,我编写了一个多线程程序并并行进行身份验证,这个时间为了找到异常发生的地方,我删除了通用 catch 块并让应用程序崩溃,我还将 windbg 配置为事后调试器。所以应用程序崩溃了,在堆栈跟踪中我发现它在“xerces”dll(一个我使用的 xml 解析器)。所以现在我知道了异常的类型,我尝试使用这些捕获块来捕获这些异常
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 块,我也尝试了“bad_alloc”(只是试一试),它也没有捕捉到它。
我遵循了 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
在这种情况下我该怎么办?你们有什么建议?
【问题讨论】:
-
So the application crashed and in the stack trace i found it is crashing in "xerces" dll(an xml parser i used). So now i know the type of exception这并不能告诉您异常的类型。您所知道的是,该 DLL 中的某些指令导致了崩溃。如果该崩溃是结构化异常 (SE),即访问冲突或某些操作系统生成的异常,则除非 DLL 和您的应用程序是在打开 SEH 异常处理的情况下构建的,否则 try / catch 将无济于事。 -
详细地说,在 C++ 中你可以抛出任何东西。字面上地。想通过 std::string 吗?当然。想抛出一个int?没问题。想抛出一个 std::exception 吗?前进。 (有很多指导方针说你不应该做什么,但没有限制你)。恕我直言,这使得 C++ 异常在很大程度上无用,因为它会导致您遇到的问题。打开 SEH 异常处理,确保它在你的 windbg 中启用。我使用的另一个技巧是单步调试代码,您经常可以找到问题所在,这可以帮助您进行调试,无论您是否知道异常。
-
(我要澄清一下,你也可以什么都不扔,
in main(){throw;}是让你的代码崩溃的最快方法之一) -
xerces 库可以抛出其他异常参考xerces.apache.org/xerces-c/apiDocs-3/hierarchy.html
标签: c++ exception performance-testing xerces-c