Подтвердить что ты не робот

Могу ли я запретить отладчику входить в файлы заголовков 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.

4b9b3361

Ответ 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