我想写一个Dtrace,以便我可以分析过程中是否发生了overflow_error
我正在执行。我只知道这是一个错误std::overflow_error
。我对如何编写D-Trace并不太了解。我需要一些初学者指南,如果有人可以让我知道如何写它。我正在运行的流程名称是superbug_returns
。我如何编写D-Trace来分析是否发生了上述情况?我正在研究solaris
答案 0 :(得分:1)
在调试器(dbx)中运行程序可能要容易得多,并让它停止抛出异常。
答案 1 :(得分:1)
我的第二个建议是尝试调试器 - 通常有一个命令来打破C ++ - 异常。这样做比较简单。
如果您坚持使用DTrace:
几年前,Sun发表了a whitepaper how to use DTrace with C++ - 阅读。
遗憾的是,将那里描述的技术应用于“跟踪异常”用例并非易事,因为异常抛出/处理是在C ++运行时并通过内部(非暴露)函数调用完成的。在gcc编译的代码中,throw ...
变为__cxa_throw(...)
,而在SunStudio编译的代码(使用不同的名称重整方案)中,函数(未编译/损坏):
void __Crun::ex_throw(void*,const __Crun::static_type_info*,void(*)(void*))
__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_
被调用。请注意,这取决于您的编译器版本; SunStudio在过去的某个时刻改变了他们的修改方案/ C ++运行时。但是在这两种情况下,std::...
都将作为参数传递,因此您只需要对特定的异常类进行DTrace,而只需要进行二次过滤(一种D探测谓词,用于测试抛出的异常是否真的是你感兴趣的一个)。你需要找出上面的函数[s]对应于std::overflow
被抛出的那些args并对它们进行过滤。
没有你的实际目标文件,我不能提供更多的建议。首先,尝试:
GCC
dtrace -n '
pid<your-process-pid>::__cxa_throw:entry
{
@exloc[ustack()] = count();
}'
SunStudio:
dtrace -n '
pid<your-process-pid>::__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_:entry
{
@exloc[ustack()] = count();
}'
在代码中查找抛出异常的位置(Ctrl + C终止DTrace为您提供统计信息)。然后从那里进行迭代(尝试转储args,看看你是否可以识别std::overflow
,通过添加/arg0 == .../
或类似于探针来过滤它。