Dtrace для переполнения памяти? - PullRequest
0 голосов
/ 07 марта 2012

Я хочу написать Dtrace, чтобы я мог проанализировать, происходит ли overflow_error в процессе я исполняю Я просто знаю, что это ошибка, выдаваемая как std::overflow_error. Я не имею большого представления о том, как написать D-Trace. Мне нужно руководство для начинающих, и если кто-то может дать мне знать, как его написать. Имя процесса, который я запускаю, скажем superbug_returns. Как я могу написать D-Trace для его анализа, происходит ли вышеописанный сценарий или нет? Я работаю над солярисом

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Второе предложение - попробовать отладчик с этим - обычно есть команда break-on-C ++ - исключение. Проще пойти по этому пути.

Если вы настаиваете на DTrace:
Несколько лет назад Sun опубликовала документ по использованию DTrace с C ++ - прочитайте это.

К сожалению, применение описанных здесь методов к сценарию использования «трассировки исключений» не тривиально, поскольку создание / обработка исключений происходит во время выполнения C ++ и выполняется посредством внутренних (неэкспонированных) вызовов функций. В скомпилированном gcc коде throw ... становится __cxa_throw(...), тогда как в скомпилированном коде SunStudio (в котором используется другая схема искажения имен) функция (unmagled / mangled):

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 и выбрасывать их.
Без вашего фактического объектного файла я не могу дать больше советов, чем это. Для начала попробуйте:

НКА:

dtrace -n '
    pid<your-process-pid>::__cxa_throw:entry
    {
        @exloc[ustack()] = count();
    }'

Студия звукозаписи Sun:

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 голос
/ 07 марта 2012

Вероятно, было бы намного проще запустить программу в отладчике (dbx) и остановить ее на выданных исключениях.

...