【发布时间】:2016-07-27 11:11:43
【问题描述】:
我试图在 c 中挂钩 printf 函数并实现一个非常相似的函数,只是它打印到 stderr 流。
printf 代码:
int printf (const char *format, ...)
{
va_list arg;
int done;
va_start (arg, format);
done = vfprintf (stdout, format, arg);
va_end (arg);
return done;
}
我将 stdout 更改为 stderr,但在使用 > /dev/null 运行时(将 stdout 重定向为 null)我仍然看不到输出。运行 ltrace 时,我可以看到它调用 puts 而不是 printf,我认为这是问题所在。
【问题讨论】:
-
如果您使用字符串文字调用 printf,那么编译器会将其优化为 puts() 调用。尝试使用需要格式字符串解析的东西(例如
int x=5; printf("%d\n", x*x);。您仍然使用标准输出调用 vfprintf?您是否验证了您的预加载库实际上已加载(尝试在您的钩子中使用简单的write(1, "hi", 2);)? -
可以将所有内容从
stdout重定向到stderr吗?如果是这样并且如果您使用的是 bash,只需写myprog arg1 arg2 argN 1>&2。最后的1>&2部分会将stdout重定向到stderr。见this。 -
为什么不只是
fprintf(stderr, ....)?尝试为库函数编写替换函数并不总是像编写同名函数那样简单......
标签: c unix printf ld-preload