我正在linux中编写一个应用程序,需要访问串口。出于调试目的,我需要嗅探来自和/或通过串行端口的内容。
我环顾四周,发现我可以使用 strace 来做到这一点。所以我尝试了以下方法:
-我打印我使用的串行设备的文件描述符。
(在重新启动我的应用程序几次后,我向自己保证,我的应用程序从内核获得的 file_descriptor 编号是“4”
- 如果我启动我的应用程序strace -e write=4 ./myapp
,我希望在终端中仅从 file_descriptor "4" 获取消息。相反,我得到了很多输出:
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\300Q\254C4\0\0\0"..., 52
fstat64(5, {st_mode=S_IFREG|0644, st_size=1448930, ...}) = 0
mmap2(0x43ab8000, 153816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0)0
mprotect(0x43ad6000, 28672, PROT_NONE) = 0
mmap2(0x43add000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRI0
close(5) = 0
munmap(0x2ab4c000, 38409) = 0
exit(0)
来自几个不同的文件描述符。
如果我运行我的应用程序strace -e trace=write -e write=4 ./myapp
我收到的消息要少得多,即使它们仍然很多,或者 file_descriptor "1"。
write(1, "GPIO data bank:0x8, data: 0x80 a"..., 52GPIO data bank:0x8, data: 0x81) = 52
write(1, "\n", 1) = 1
write(1, "--> Version: 0677 <--\n", 22--> Version: 0677 <-- ) = 22
serial fd = 4
你在上面看到的是一些printf
陈述。极其奇怪的部分是该行也是一个 printf 语句,但由于某种原因,它没有在输出中serial fd = 4
环绕write(fd, ....)
语句。strace
有人也可以解释一下吗?
感谢您的帮助。