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