Сделать Qt debugger пропустить QSharedPointer или std :: unique_ptr c'tor [duplicate]

6
задан Warren Seine 15 April 2011 в 12:48
поделиться

4 ответа

* Изменения в GDB 7.4

  • Теперь GDB позволяет пропускать неинтересные функции и файлы при переходе с «функцией пропуска» и «пропустить файл» ".
9
ответ дан matt 21 August 2018 в 11:42
поделиться
  • 1
    Наконец, ответ, который я могу принять. Oorah! – Warren Seine 14 November 2012 в 17:39
  • 2
    как добавить их в файл gdbinit без gdb, спрашивая & quot; Игнорировать файл в ожидании загрузки будущей общей библиотеки? (y или [n]) " – viktorzeid 10 December 2014 в 21:26
  • 3
    Это позволяет мне пропускать весь код в текущем файле (skip file). Могу ли я не предварительно сконфигурировать gdb, чтобы пропустить все, например, /usr/include? – dhardy 11 May 2015 в 11:55
  • 4
    @dhardy AFAIK, на данный момент нет способа сделать это, кроме вызова «skip file /usr/include/foo.h» для всего, что находится в / usr / include – matt 12 May 2015 в 18:33
  • 5
    @dhardy, хотел сделать то же самое и нашел способ с помощью python (см. внизу здесь ), он просто вызывает skip file для всей стандартной библиотеки при запуске отладки программы на C ++. Очевидным требованием является то, что gdb должен быть скомпилирован с поддержкой python (или переписать этот код в Guile, если у вас это есть). – xaizek 26 May 2016 в 12:15

Пошаговые инструкции и пропустить все файлы без источника

Это будет слишком медленным для большинства приложений, но это весело!

На основании: Отображение каждой инструкции сборки в gdb

class ContinueUntilSource(gdb.Command):
    def __init__(self):
        super().__init__(
            'cus',
            gdb.COMMAND_BREAKPOINTS,
            gdb.COMPLETE_NONE,
            False
        )
    def invoke(self, argument, from_tty):
        argv = gdb.string_to_argv(argument)
        if argv:
            gdb.write('Does not take any arguments.\n')
        else:
            done = False
            thread = gdb.inferiors()[0].threads()[0]
            while True:
                message = gdb.execute('si', to_string=True)
                if not thread.is_valid():
                    break
                try:
                    path = gdb.selected_frame().find_sal().symtab.fullname()
                except:
                    pass
                else:
                    if os.path.exists(path):
                        break
ContinueUntilSource()

Проверено в Ubuntu 16.04, GDB 7.11. GitHub вверх по течению .

1
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 21 August 2018 в 11:42
поделиться
  • 1
    Мне нужны инструкции «Шаг и пропустить, пока не достигнут определенный источник». Легко ли изменить скрипт? – midenok 8 March 2018 в 16:35
  • 2
    @midenok должен быть просто вопросом дальнейшей проверки gdb.selected_frame().find_sal().symtab.fullname(), если вы хотите сделать перерыв в любой строке данного файла. – Ciro Santilli 新疆改造中心 六四事件 法轮功 8 March 2018 в 16:46

gdb 7.12 поддерживает флешинг файлов, чтобы указать файлы для пропусков в отладчике. Документация для нее такова:

https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html

Чтобы пропустить шаг за шагом во все заголовки библиотек в каталоге / usr / include / c ++ / 5 / bits, добавьте следующие строки в ~ / .gdbinit

# To skip all .h files in /usr/include/c++/5/bits
skip -gfi /usr/include/c++/5/bits/*.h

Вместо этого пропустите конкретную файл, скажем, stl_vector.h, добавьте следующие строки в ~ / .gdbinit

# To skip the file /usr/include/c++/5/bits/stl_vector.h
skip file /usr/include/c++/5/bits/stl_vector.h

Выполнение вышеуказанного с помощью gdb версии 7.11 и ниже приводит к следующей ошибке:

Ignore function pending future shared library load? (y or [n]) [answered N; input not from terminal]

Однако gdb 7.12, похоже, решил проблему выше.

Этот блог обращается к той же проблеме для версии gdb версии 7.11 или ниже.

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

info skip
4
ответ дан Dhiraj Reddy 21 August 2018 в 11:42
поделиться
  • 1
    Если местоположение вашего STL-файла меняется, вы можете, например, skip -gfile bits/*.h. – John H. 2 June 2017 в 15:32
  • 2
    Это также полезно для skip -function "operator new". – John H. 2 June 2017 в 15:33
  • 3
    Предполагается работать, но не для меня :( skip -gfi /usr/include/c++/6/bits/*.h run s std::vector<int, std::allocator<int> >::~vector (this=0x7fffffffaf10, __in_chrg=<optimized out>) at /usr/include/c++/6/bits/stl_vector.h:426 – Jeff Trull 21 June 2017 в 15:18
  • 4
    Запрос рекурсивно пропустить каталоги: sourceware.org/bugzilla/show_bug.cgi?id=22198 – Ciro Santilli 新疆改造中心 六四事件 法轮功 24 September 2017 в 13:07

Изменено из команды answer команды Ciro Santilli ss внутри определенного источника. Вы можете указать имя исходного файла, или будет выведено текущее. Очень удобен для перехода через источники bison / yacc или другие мета-источники, которые генерируют код С и вставляют директивы #line.

import os.path

class StepSource(gdb.Command):
    def __init__(self):
        super().__init__(
            'ss',
            gdb.COMMAND_BREAKPOINTS,
            gdb.COMPLETE_NONE,
            False
        )
    def invoke(self, argument, from_tty):
        argv = gdb.string_to_argv(argument)
        if argv:
            if len(argv) > 1:
                gdb.write('Usage:\nns [source-name]]\n')
                return
            source = argv[0]
            full_path = False if os.path.basename(source) == source else True
        else:
            source = gdb.selected_frame().find_sal().symtab.fullname()
            full_path = True
        thread = gdb.inferiors()[0].threads()[0]
        while True:
            message = gdb.execute('next', to_string=True)
            if not thread.is_valid():
                break
            try:
                cur_source = gdb.selected_frame().find_sal().symtab.fullname()
                if not full_path:
                    cur_source = os.path.basename(cur_source)
            except:
                break
            else:
                if source == cur_source:
                    break
StepSource()

Известные ошибки

  1. t прерывать отладчик на SIGINT во время работы;
  2. изменил pass на break на исключение, так как не уверен, что он прав.
0
ответ дан midenok 21 August 2018 в 11:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: