Dtrace для переполнения памяти?

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

2 ответа

Второе предложение - попробовать отладчик с этим - обычно есть команда 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 == .../ или похож на зонд).

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

Другие вопросы по тегам