Могу ли я предотвратить переход отладчика в файлы заголовков Boost или STL? - PullRequest
18 голосов
/ 02 июня 2011

Я использую Qt Creator с gdb для отладки своего кода C ++ на платформе Linux. Всякий раз, когда я использую boost::shared_ptr или подобное, отладчик входит в заголовочные файлы, содержащие реализацию надстройки (т.е. / usr / include /boost/shared_ptr.hpp). Я хотел бы игнорировать эти файлы с точки зрения отладки и просто перешагнуть через них. Я знаю, что могу выйти, как только он достигнет одного из этих файлов, но отладку было бы намного проще, если бы не делать это несколько раз за сеанс отладки.

Я использую компилятор gcc (g++), работающий на OpenSuSE Linux 11.2 с QtCreator 2.2 (который использует gdb в качестве отладчика.)

Изменить, чтобы добавить: Вопрос направлен на файлы Boost, но также может относиться и к файлам STL.

Ответы [ 4 ]

6 голосов
/ 10 марта 2017

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>).

3 голосов
/ 11 июня 2011

GDB является сценарием.он имеет, хотя, если переменные, подкоманды оболочки, пользовательские функции (определение) и т. д. и т. д., у него есть интерфейс python для сценариев.

Немного потрудившись, вы можете создать скрипт gdb по следующим направлениям:

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

или найдите, кто-нибудь уже сделал такой скрипт

0 голосов
/ 05 января 2019

С https://stackoverflow.com/a/31629136/5155476:

У меня была такая же потребность.Я расширил команду 'skip' в gdb для поддержки нового типа 'dir'.Теперь я могу сделать это в gdb:

skip dir /usr

, и тогда меня никогда не остановят ни в одном из моих сторонних заголовков.

Вот веб-страница с этой информацией + патч, если онПомогает всем: информация и патч для пропуска каталогов в GDB

0 голосов
/ 11 июня 2011

Вместо выполнения s (шаг), вы можете
b в первой строке вашей функции, где вы хотите остановиться (b Class :: method или b file.cpp: line),
затем c.

GDB пропустит код повышения и прервется в точке, указанной в b, где вы хотите это

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

msvc ведет себя подобно gdb

...