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