我想写一个Dtrace,这样我就可以分析我正在执行的进程中是否发生了overflow_error。我只知道这是一个作为std::overflow_error抛出的错误。我对如何编写D-Trace没有太多的想法。我需要一些初学者指南,如果有人可以让我知道如何写它。我运行的进程名是superbug_returns。我如何为它编写一个D-Trace来分析上面的场景是否发生?我在solaris上工作
发布于 2012-03-07 05:19:10
在调试器(dbx)中运行程序,并让它在抛出异常时停止,可能会容易得多。
发布于 2012-03-07 19:13:30
我再次建议尝试使用这个调试器--通常会有一个中断-C++-异常的命令。走那条路更简单。
如果您坚持使用DTrace:
几年前,Sun发布了a whitepaper how to use DTrace with C++ - read。
不幸的是,将这里描述的技术应用于“跟踪异常”用例并不容易,因为异常抛出/处理是在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探测谓词,用于测试抛出的异常是否真的是您感兴趣的异常)。您需要找出与抛出的std::overflow对应的上述函数的哪些参数,并对这些参数进行过滤。
没有你的实际目标文件,我不能给你更多的建议。首先,尝试一下:
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会给出统计信息)。然后从那里迭代(尝试转储参数,看看是否可以识别std::overflow,通过添加/arg0 == .../或类似于探测器来过滤)。
https://stackoverflow.com/questions/9591731
复制相似问题