首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存溢出的Dtrace?

内存溢出的Dtrace?
EN

Stack Overflow用户
提问于 2012-03-07 04:54:07
回答 2查看 348关注 0票数 0

我想写一个Dtrace,这样我就可以分析我正在执行的进程中是否发生了overflow_error。我只知道这是一个作为std::overflow_error抛出的错误。我对如何编写D-Trace没有太多的想法。我需要一些初学者指南,如果有人可以让我知道如何写它。我运行的进程名是superbug_returns。我如何为它编写一个D-Trace来分析上面的场景是否发生?我在solaris上工作

EN

回答 2

Stack Overflow用户

发布于 2012-03-07 05:19:10

在调试器(dbx)中运行程序,并让它在抛出异常时停止,可能会容易得多。

票数 1
EN

Stack Overflow用户

发布于 2012-03-07 19:13:30

我再次建议尝试使用这个调试器--通常会有一个中断-C++-异常的命令。走那条路更简单。

如果您坚持使用DTrace:

几年前,Sun发布了a whitepaper how to use DTrace with C++ - read。

不幸的是,将这里描述的技术应用于“跟踪异常”用例并不容易,因为异常抛出/处理是在C++运行时中进行的,并且是通过内部(未公开的)函数调用完成的。在gcc编译的代码中,throw ...变成了__cxa_throw(...),而在SunStudio编译的代码(使用不同的名称损坏方案)中,是一个函数(未损坏/损坏):

代码语言:javascript
复制
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:

代码语言:javascript
复制
dtrace -n '
    pid<your-process-pid>::__cxa_throw:entry
    {
        @exloc[ustack()] = count();
    }'

SunStudio:

代码语言:javascript
复制
dtrace -n '
    pid<your-process-pid>::__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_:entry
    {
        @exloc[ustack()] = count();
    }'

查找代码中抛出异常的位置(使用Ctrl+C终止DTrace会给出统计信息)。然后从那里迭代(尝试转储参数,看看是否可以识别std::overflow,通过添加/arg0 == .../或类似于探测器来过滤)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9591731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档