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

Как я могу поставить точку останова на "что-то печатается на терминал" в gdb?

Я хотел бы знать, откуда внутри огромного приложения печатается определенное сообщение. Приложение настолько большое и старое, что оно использует все мыслимые способы печати текста на терминал; например printf(), fprintf (stdout,...) и т.д.

Я пишу, чтобы поставить точку останова на системный вызов write(), но затем я залил слишком много остановок останова из-за различных операций ввода-вывода файлов, которые также используют write().

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

4b9b3361

Ответ 1

Используйте условную точку останова, которая проверяет первый параметр. В 64-битных системах x86 условие:

(gdb) b напишите, если 1 == $rdi

В 32-битных системах это сложнее, потому что параметр находится в стеке, что означает, что вам нужно передать $esp в int * и индексировать параметр fd. Стек в этой точке имеет адрес возврата, длину, буфер и, наконец, fd.

Это сильно зависит от аппаратных платформ.

Ответ 2

С помощью gdb 7.0 вы можете установить условную точку останова в syscall write():

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

$ebx содержит первый параметр syscall - номер FD здесь