Корреляция вывода строк с вызовами функций исходного кода

1094
joe

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

0

1 ответ на вопрос

1
Jonathan Ben-Avraham

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

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

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

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

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

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