strace
Утилита показывает вам системные вызовы. Большинство скомпилированных программ в Linux со временем связываются со стандартной библиотекой C, называемой «glibc», хотя фактическое имя файла библиотеки таково libc.so.6
. «Системные вызовы» языка C, такие как «open», «read», «write», фактически являются функциями-обертками для реальных системных вызовов, которые выполняет библиотека glibc. Иногда оболочки включают в себя удивительное количество кода, о котором вы обычно не думаете. Иногда программисты используют библиотеки с функциями, которые выполняют несколько вызовов glibc, которые выполняют несколько системных вызовов. Кроме того, если вы видите определенное «чтение» в strace
выводе, у вас нет никакого способа связать его с определенным «чтением» или другим вызовом библиотечной функции в исходном коде.strace
вывод с конкретными строками кода в исходном файле.
Я предполагаю, что когда вы заявляете, что у вас есть исходный код, вы имеете в виду, что вы также можете скомпилировать его в работающую исполняемую программу. Если это действительно так, то вам лучше всего набрать код с printf
символом s, fflush(stdout)
а затем запустить программу strace
. Для printf
S вы можете попробовать что-то вроде
printf(__FILE__ ", %s:%d Entered\n", __FUNCTION__, __LINE__), fflush(stdout);
в начале каждой функции C. Вы можете определить вышеупомянутую строку как marcro препроцессора, который условно определен как выше или как ничто, в зависимости от другого макроса, такого как DEBUG
, чтобы вы могли оставить эти макросы в своей кодовой базе и скомпилировать код с DEBUG
определенным или без него .
Вы увидите printf
системные вызовы «write» и их выходные данные, перемежающиеся между системными вызовами, которые читают нажатия клавиш. Это должно позволить вам сосредоточиться на функциях исходного кода, которые читают ввод tty. Это может потребовать некоторых настойчивых усилий.