我试图在运行Debian 8.7的BeagleBone上调试串行连接。为此,我写了一个测试程序。我没有得到我期待的结果,所以我在测试程序上开了一个strace。为什么不strace记录我所有的系统调用?
果然,我期待看到的写系统调用不在那里。我检查了我的源代码,他们肯定应该在那里。测试程序基本上是这样的:
loop:
write a log message to stderr
write a buffer of binary 0x00 to the serial port
write a different log message to stderr
write a buffer of binary 0xff to the serial port
该方案在标准错误,看起来像这样产生的输出:
2015/11/12 21:28:45 111...
2015/11/12 21:28:46 000...
2015/11/12 21:28:48 111...
2015/11/12 21:28:49 000...
2015/11/12 21:28:51 111...
2015/11/12 21:28:52 000...
2015/11/12 21:28:54 111...
2015/11/12 21:28:55 000...
2015/11/12 21:28:57 111...
2015/11/12 21:28:58 000...
2015/11/12 21:29:00 111...
2015/11/12 21:29:01 000...
2015/11/12 21:29:03 111...
2015/11/12 21:29:04 000...
2015/11/12 21:29:06 111...
2015/11/12 21:29:07 000...
2015/11/12 21:29:09 111...
2015/11/12 21:29:10 000...
2015/11/12 21:29:12 111...
2015/11/12 21:29:13 000...
2015/11/12 21:29:15 111...
2015/11/12 21:29:16 000...
2015/11/12 21:29:18 111...
2015/11/12 21:29:19 000...
2015/11/12 21:29:21 111...
我再观察,并不是所有的写入到stderr在strace的输出中出现。第一个日志消息将会运行,而第二个日志消息不会发生,这在上述算法中不会发生。以下是输出的摘录,通过grepping trace.log进行过滤以进行写入。正如你所看到的,strader入口比stderr中的行数少得多,表明strace没有记录所有正在进行的系统调用。
write(2, "2015/11/12 21:28:46 000...\n", 27) = 27
write(2, "2015/11/12 21:28:49 000...\n", 27) = 27
write(2, "2015/11/12 21:28:52 000...\n", 27) = 27
write(2, "2015/11/12 21:28:55 000...\n", 27) = 27
write(2, "2015/11/12 21:28:58 000...\n", 27) = 27
write(2, "2015/11/12 21:29:01 000...\n", 27) = 27
write(2, "2015/11/12 21:29:04 000...\n", 27) = 27
write(2, "2015/11/12 21:29:07 000...\n", 27) = 27
write(2, "2015/11/12 21:29:12 111...\n", 27) = 27
write(2, "2015/11/12 21:29:15 111...\n", 27) = 27
write(2, "2015/11/12 21:29:18 111...\n", 27) = 27
write(2, "2015/11/12 21:29:21 111...\n", 27) = 27
有一个在我的源或任何我使用的是去图书馆没有并发,也没有任何的子进程分叉。
我检查了strace手册页,似乎没有任何方法可以指定统计采样的系统调用,并且没有指出它不会记录所有这些信息,除非您指定一个过滤表达式(我没有' T)。
我不知道是否写入系统调用指向串行端口实际上正在发生,但现在我不能相信strace输出,因为它不显示我所知道的所有系统调用。
任何人都可以解释发生了什么?
我的命令行是:
strace -o trace.log -v ./serial-test --device /dev/ttyO2 --oscillator --delay 500
更新:有朋友建议添加-f标志,它似乎并提供帮助。不清楚的是,为什么,因为文档建议-f仅在调用fork()的情况下有用,并且在我的程序中(或者实际上,在strace输出中)都没有。好吧,那么,联机帮助页也指clone(),并且使用clone()创建Linux线程。去使用Linux线程,所以这解释了这个问题。