Могу ли я запретить отладчику входить в файлы заголовков Boost или STL?
Я использую Qt Creator с gdb для отладки моего кода на С++ на платформе Linux. Всякий раз, когда я использую boost::shared_ptr
или тому подобное, отладчик переходит в файлы заголовков, содержащие реализацию повышения (то есть /usr/include /boost/shared_ptr.hpp
). Я хотел бы игнорировать эти файлы с точки зрения отладки и просто перешагнуть их. Я знаю, что могу выйти, как только он достигнет одного из этих файлов, но было бы намного проще отлаживать, если не делать этого несколько раз за сеанс отладки.
Я использую компилятор gcc (g++
), работающий на OpenSuSE Linux 11.2 с QtCreator 2.2 (который использует gdb
в качестве отладчика.)
Изменить для добавления: вопрос связан с файлами Boost, но также может применяться к файлам STL.
Ответы
Ответ 1
GDB, не входя в STL и все другие библиотеки в /usr :
Поместите в файл .gdbinit
следующее. Он ищет источники, загруженные или потенциально загруженные gdb (команда gdb info sources
), и пропускает их, когда их абсолютный путь начинается с "/usr". Он подключен к команде run
, потому что символы могут перезагружаться при ее выполнении.
# skip all STL source files
define skipstl
python
# get all sources loadable by gdb
def GetSources():
sources = []
for line in gdb.execute('info sources',to_string=True).splitlines():
if line.startswith("/"):
sources += [source.strip() for source in line.split(",")]
return sources
# skip files of which the (absolute) path begins with 'dir'
def SkipDir(dir):
sources = GetSources()
for source in sources:
if source.startswith(dir):
gdb.execute('skip file %s' % source, to_string=True)
# apply only for c++
if 'c++' in gdb.execute('show language', to_string=True):
SkipDir("/usr")
end
end
define hookpost-run
skipstl
end
Чтобы проверить список файлов, которые нужно пропустить, установите точку останова где-нибудь (например, break main
) и запустите gdb (например, run
), затем проверьте с помощью info sources
при достижении точки останова:
(gdb) info skip
Num Type Enb What
1 file y /usr/include/c++/5/bits/unordered_map.h
2 file y /usr/include/c++/5/bits/stl_set.h
3 file y /usr/include/c++/5/bits/stl_map.h
4 file y /usr/include/c++/5/bits/stl_vector.h
...
Его легко расширить, чтобы пропустить другие каталоги, добавив вызов SkipDir(<some/absolute/path>)
.
Ответ 2
gdb доступен для сценариев. он имеет, если, переменные, подкоманды оболочки, определяемые пользователем функции (определить) и т.д. и т.д., он имеет интерфейс python для возможности сценариев.
С небольшим количеством работы вы можете сделать gdb script в следующих строках:
define step-bypass-boost
step
while 1
use "info source", put current source file into variable
if source file does not match */boost/* then
break-loop
end
step
end
end
или найдите, сделал ли кто-нибудь такой script
Ответ 3
Вместо s (шаг) вы можете использовать
b в первой строке вашей функции, где вы хотите остановить (b Class:: method, или b file.cpp: line),
то c.
gdb обходит код форсирования и прерывается в точке, заданной в b, где вы хотите
это работает, но может показаться утомительным. это дело привычки. становится легче с повторением.
msvc ведет себя аналогично gdb
Ответ 4
С fooobar.com/info/253605/...:
У меня была такая же потребность. Я расширил команду 'skip' в gdb для поддержки нового типа 'dir'. Теперь я могу сделать это в GDB:
skip dir /usr
и тогда я никогда не останавливаюсь ни в одном из моих сторонних заголовков.
Вот веб-страница с этой информацией + патч, если он кому-нибудь поможет: информация и патч для пропуска каталогов в GDB