我有一个C服务器程序,可以创建&打开命名管道的写入端(在/ var / run中),并在SIGIO信号上中断tty uart,将数据从该接口推送到管道中。
这个程序还会生成一个辅助pthread,它打开一个单独管道的读取端(同样,在/ var / run中),从中读取(阻塞),并将该数据传递回我的主线程以便写出来我的tty。
使用互斥锁结构在这些数据之间共享数据。我还有一个测试客户端程序来处理另一端。权限/文件访问权限有效。
这似乎在bash中运行良好。
我想用Valgrind加倍确定,特别是memcheck和helgrind工具,用于内存泄漏和线程错误。但是当我在valgrind中启动我的服务器程序时,它会挂起并且在我的客户端启动时不会运行。我甚至没有在程序开始时从服务器上看到我的初始启动printf。 Valgrind就坐在那里,直到我杀了它。
我正在运行以下选项:
valgrind --tool=helgrind ./server
和
valgrind --undef-value-errors=no ./server
输出如下(对于两个命令):
==7577== Memcheck, a memory error detector
==7577== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==7577== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==7577== Command: ./server
==7577==
--7577-- WARNING: Serious error when reading debug info
--7577-- When reading debug info from /lib/arm-linux-gnueabihf/ld-2.24.so:
--7577-- Ignoring non-Dwarf2/3/4 block in .debug_info
--7577-- WARNING: Serious error when reading debug info
--7577-- When reading debug info from /lib/arm-linux-gnueabihf/ld-2.24.so:
--7577-- Last block truncated in .debug_info; ignoring
抑制undef-value-errors,因为ld.so有吨,而且它充斥着我的输出。
你能想到我可能做错了吗?也许ld库中缺少调试信息?如果需要,我可以转储代码,或者进一步详细说明。
谢谢。
答案 0 :(得分:1)
看起来你的valgrind版本相当陈旧:
==7577== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==7577== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
假设ld-2.24.so
来自glibc,那是大约五年的工具链开发,谁知道在用于编译glibc的gcc和binutils版本时会有什么样的改进。