Dtrace内存溢出?

时间:2012-03-06 20:54:07

标签: c++ solaris

我想写一个Dtrace,以便我可以分析过程中是否发生了overflow_error 我正在执行。我只知道这是一个错误std::overflow_error。我对如何编写D-Trace并不太了解。我需要一些初学者指南,如果有人可以让我知道如何写它。我正在运行的流程名称是superbug_returns。我如何编写D-Trace来分析是否发生了上述情况?我正在研究solaris

2 个答案:

答案 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 == .../或类似于探针来过滤它。