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) и остановить ее на выданных исключениях.