gcc — C ++ и callstack — можно ли использовать его для получения номеров строк?

Я не могу вспомнить, с какой библиотекой GCC работает для реализации раскрутки стека, которая используется для исключений c ++ и трассировок вызовов, и я знаю, что в спецификации C ++ не определены средства, поэтому любые ответы на это зависят от платформы. Я использую GCC 4.9.0.

Знание, где что-то пошло не так, очень полезно, особенно во время отладки. Поэтому довольно часто у меня есть макросы, которые расширяются и передают что-то __LINE__ а также __FILE__ в расширении.

Мне не очень нравится делать это, но он говорит вам, откуда была вызвана функция (как макросы __LINE__ а также __FILE__ на сайте вызова), что очень удобно!

Вместо того, чтобы использовать некоторые ужасные макросы, условно определяемые на основе сборки, было бы неплохо иметь некоторый условно определенный код, который использует библиотеку разматывания стека.

Какая библиотека используется? При компиляции можно сказать компилятору, сколько информации записать? Очевидно, что для сборки релиза вы просто хотите то, что нужно для обработки исключений.

Если нет, то что такое конвенция? Как программисты на C ++ получают то, что программисты на Python и Java считают само собой разумеющимся — подробные трассировки стека.

Я полагаю, что запасным, но не очень элегантным решением было бы создать новую базу, из которой я выкидываю исключения, и имею макрос, который перебрасывает и добавляет строки, файлы и __FUNCTION__, но это запасной вариант.

Меня интересует, какую библиотеку GCC использует и какие опции предоставляет GCC для управления объемом информации, который она вносит, поэтому, пожалуйста, поделитесь своими знаниями об этом!

3

Решение

Вот еще один вариант, если вы используете под Linux.

1) Создайте свой обработчик сигнала, поэтому любое исключение будет обрабатываться вашим собственным обработчиком сигнала, а не системой, такой как создание файла coredump.

2) В вашем обработчике сигналов используйте системный вызов pstack для генерации информации трассировки до тех пор, пока не получите исключение.

like :: system («pstack yourpid> logfilename»);

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]