Получение GDB для сохранения списка точек останова?

Отличная книга. Читай сам. Я полагаю, что это та часть, которую вы упускаете:

def test_cannot_add_empty_list_items(self):
    # Edith goes to the home page and accidentally tries to submit
    # an empty list item. She hits Enter on the empty input box
    self.browser.get(self.live_server_url)
    self.get_item_input_box().send_keys(Keys.ENTER)

    '''
    If you keep reading a little farther, it should tell you that modern browsers
    will not submit forms when fields that are 'required' left are blank.
    '''
    # The browser intercepts the request, and does not load the
    # list page
    self.wait_for(lambda: self.browser.find_elements_by_css_selector(
        '#id_text:invalid'  
    ))

Если вы продолжите читать немного дальше, вам следует сказать, что «современные браузеры не будут отправлять forms, когда поля required не заполнено. Это должно дать вам поправку к коду выше.

124
задан Community 23 May 2017 в 12:02
поделиться

8 ответов

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

11
ответ дан 24 November 2019 в 01:06
поделиться

Этот ответ устарел, gdb теперь поддерживает сохранение непосредственно. См. этот ответ.

Можно использовать вход:

(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) q

Файл breaks.txt теперь содержит:

Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>

Запись awk сценария, который преобразовывает это в формат, полезный для .gdbinit или a --command файл легок. Или можно даже заставить сценарий испустить отдельный --eval-commandк gdb командной строке...

Добавление этого маленького макроса к .gdbinit поможет Вам сделать это:

# call with dump_breaks file.txt
define dump_breaks
    set logging file $arg0
    set logging redirect on
    set logging on
    info breakpoints
    set logging off
    set logging redirect off
end
26
ответ дан 24 November 2019 в 01:06
поделиться

Проблема в том, что установка точки останова зависит от контекста. Что, если у вас есть две статические функции с именем foo? Если ты уже отлаживает один из модулей, который определяет foo, затем gdb предположит, что вы имели в виду именно это. Но если вы просто сбросите "разбить foo" в файл, а затем прочитать этот файл при запуске, не будет ясно, какую функцию foo вы имеете в виду.

0
ответ дан 24 November 2019 в 01:06
поделиться

Дополнение к ответу Johannes: вы можете автоматически переформатировать вывод info break в правильный командный файл gdb:

.gdbinit:

define bsave
   shell rm -f brestore.txt
   set logging file brestore.txt
   set logging on
   info break
   set logging off
   # reformat on-the-fly to a valid gdb command file
   shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end 
document bsave
  store actual breakpoints
end

После этого у вас есть правильный командный файл в brestore.gdb

Это сработало для меня, когда приложение скомпилировано с -g.

EDIT: успешно протестировано с gdb v6.8 на Ubuntu Karmic.

6
ответ дан 24 November 2019 в 01:06
поделиться

Расширение анонимного расширения ответа Йоханнеса:

.gdbinit:

define bsave
    shell rm -f brestore.txt
    set logging file brestore.txt
    set logging on
    info break
    set logging off
    # reformat on-the-fly to a valid gdb command file
    shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end 
document bsave
  store actual breakpoints
end

define brestore
  source brestore.gdb
end
document brestore
  restore breakpoints saved by bsave
end

С помощью brestore вы можете восстановить точки останова, сохраненные с помощью bsave .

9
ответ дан 24 November 2019 в 01:06
поделиться

Есть еще идеи? У меня

warning: Current output protocol does not support redirection

после

set logging on

РЕДАКТИРОВАТЬ:

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

gdb> source breakpoints.txt

, где breakpoints.txt - это такой файл:

break main.cpp:25
break engine.cpp:465
break wheel.cpp:57
0
ответ дан 24 November 2019 в 01:06
поделиться
3
ответ дан 24 November 2019 в 01:06
поделиться

предупреждение: протокол токового выхода не не поддерживает перенаправление

Я также получаю эту ошибку / предупреждение в GDB при попытке включить ведение журнала в режиме TUI, однако ведение журнала, похоже, работает в режиме "без TUI". Поэтому я выхожу из режима TUI всякий раз, когда хочу что-то записать. (Переключайтесь назад и вперед в режим TUI с помощью CTRL-X , CTRL-A ).

Вот как я работаю:

  1. запустить GDB (в обычном режиме)
  2. включить ведение журнала: включить запись в журнал - теперь он не должен жаловаться.
  3. переключаться назад / вперед в режим TUI и делать что-то GDB
  4. , когда я хочу что-то записать (например, огромный дамп обратной трассировки) - переключаться в нормальный режим

Надеюсь, это поможет, / M: o)

1
ответ дан 24 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

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