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