2017-02-09 67 views
2

我试图在运行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线程,所以这解释了这个问题。

回答

2

这归结为golang会自由使用线程,因此您需要使用strace -f标志以追踪代表您创建的辅助线程。

因此,需要由fork()系统调用创建,也用于clone()创建[也vfork()]线程的子进程的strace -f标志。我的错误是相信这只是儿童进程所必需的。

相关问题