gpt4 book ai didi

linux - 系统调用中的 printf 返回格式错误的输出

转载 作者:太空狗 更新时间:2023-10-29 12:28:00 25 4
gpt4 key购买 nike

我正在使用 kext 在 OS X 中记录系统调用,如下所示:

int hook_read(struct proc *p, struct read_args *u, user_ssize_t *r) {
/* get som params here... */
printf("[IDEN] SYS_read called, %s, %d, %d, %d.\n", params);
return read(p, u, r);
}

这记录到 system.log。现在的问题是,如果 printf 负载很高(调用了很多系统调用),system.log 中的输出通常格式错误:ID]SYS_readEN] callparam, 123, ed 123, 123 例如。字符串被扰乱了。如果我使用打印到串行端口的 kprintf,则永远不会出现格式错误的日志。

非常感谢知道是什么导致了这种行为!

最佳答案

printf/IOLog 使用缓冲区将消息发送到用户空间,然后将它们记录到系统日志中。如果您输出大量消息,这个缓冲区可能会在日志守护程序有机会清除它之前变满,并且您的消息将被截断并开始相互碰撞。 (printf/IOLog 将在消息提交到缓冲区后立即返回,而不会等待守护进程接收它。)

此外,我不确定内核 printf/IOLog 是否在任何方面都是线程安全的,因此从多个线程同时调用它也可能会导致竞争条件。我必须检查来源才能确定。

kprintf 是完全同步的,并且会阻塞,直到您的消息在串行端口上传输或通过火线提交。它也是线程安全的。在火线情况下,kprintf 输出也被缓冲,因此如果您输出很多 消息,这也可能会填满并导致截断。 fwkpfv 命令允许您使用 --buffer 参数指定缓冲区大小,因此您可以抵消它。同步 kprintf 的缺点是它会因大量消息而显着降低系统速度。

关于linux - 系统调用中的 printf 返回格式错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com