Я пытаюсь исправить проблему с клавиатурой в приложении Linux, для которого у меня есть исходный код. Приложение запускает TCP-сервер и отправляет локальные события клавиатуры и мыши подключенным клиентам. Как лучше всего опросить работающий процесс сервера, чтобы выяснить, какие функции исходного кода он использует для перехвата нажатий клавиш? Будет ли утилита strace работать на это каким-то образом? Использование флага -c с strace показывает системные вызовы, которые выполняет приложение, но не знает, как отследить это до функций исходного файла.

1 ответ1

1

Утилита strace показывает системные вызовы. Большинство скомпилированных программ в Linux в конечном итоге связываются со стандартной библиотекой C, называемой "glibc", хотя фактическое имя файла библиотеки - libc.so.6 . "Системные вызовы" языка C, такие как "open", "read", "write", фактически являются функциями-обертками для реальных системных вызовов, которые выполняет библиотека glibc. Иногда оболочки включают в себя удивительное количество кода, о котором вы обычно не думаете. Иногда программисты используют библиотеки с функциями, которые выполняют несколько вызовов glibc, которые выполняют несколько системных вызовов. Кроме того, если вы видите определенное "чтение" в выводе strace , у вас нет никакого способа связать его с определенным "чтением" или другим вызовом библиотечной функции в исходном коде. Результатом этого является то , что не существует общего способа соотнести выход strace с конкретными строк кода в исходном файле.

Я предполагаю, что когда вы заявляете, что у вас есть исходный код, вы имеете в виду, что вы также можете скомпилировать его в работающую исполняемую программу. Если это действительно так, то лучше всего использовать код с printf s, затем fflush(stdout) и затем запустить программу под strace . Для printf вы можете попробовать что-то вроде

printf(__FILE__ ", %s:%d Entered\n", __FUNCTION__, __LINE__), fflush(stdout);

в начале каждой функции C. Вы можете определить вышеупомянутую строку как marcro препроцессора, который условно определен как выше или как ничто, в зависимости от другого макроса, такого как DEBUG , так что вы можете оставить эти макросы в своей кодовой базе и скомпилировать код с определенным или без DEBUG .

Вы увидите, что системные вызовы printf "write" и их вывод перемежаются между системными вызовами, которые читают нажатия клавиш. Это должно позволить вам сосредоточиться на функциях исходного кода, которые читают ввод tty. Это может потребовать некоторых настойчивых усилий.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .