将 strace 输出与源代码函数调用关联

将 strace 输出与源代码函数调用关联

我正在尝试修复 Linux 应用程序中的键盘问题,我有该应用程序的源代码。该应用程序启动 TCP 服务器并向连接的客户端发送本地键盘和鼠标事件。询问正在运行的服务器进程以找出它使用哪些源代码函数来捕获击键的最佳方法是什么?该strace实用程序能以某种方式解决这个问题吗?使用-c带有标志的函数strace可以显示应用程序正在进行的系统调用,但不确定如何将其追溯到源文件函数。

答案1

strace实用程序向您显示系统调用。Linux 中的大多数已编译程序最终都会链接到标准 C 库(称为“glibc”,尽管实际库文件名是) libc.so.6。C 语言“系统调用”(例如“open”、“read”、“write”)实际上是 glibc 库执行的实际系统调用的包装函数。有时包装器包含大量您通常不会想到的代码。有时程序员使用带有函数的库,这些函数会进行多个 glibc 调用,而这些调用又会执行多个系统调用。此外,如果您在输出中看到特定的“read” strace,则无法将其与源代码中的特定“read”或其他库函数调用联系起来。结果是没有通用的方法将strace输出与源文件中的特定代码行关联起来。

我假设当您说您有源代码时,您的意思是您也可以将其编译成可运行的可执行程序。如果确实如此,那么最好的办法是使用 s 和printfwith来检测代码fflush(stdout),然后在 下运行该程序strace。对于printfs,您可以尝试类似

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

在每个 C 函数的开头。您可以将上述行定义为预处理器宏,该宏有条件地定义为上述宏或不定义为任何宏,具体取决于另一个宏(例如)DEBUG,以便您可以将这些宏保留在代码库中,并在定义或不定义的情况下编译代码DEBUG

您将看到printf“写入”系统调用及其输出散布在读取击键的系统调用中。这应该可以让您集中精力于读取 tty 输入的源代码函数。这可能需要一些坚持不懈的努力。

相关内容