C 客户端/服务器pthreads程序未在Valgrind下执行。运行正常

C 客户端/服务器pthreads程序未在Valgrind下执行。运行正常,c,linux,multithreading,gcc,valgrind,C,Linux,Multithreading,Gcc,Valgrind,我有一个C服务器程序,它创建并打开命名管道(in/var/run)的写入端,并中断tty uart的SIGIO信号,将数据从该接口推送到管道中 这个程序还生成一个辅助pthread,它打开一个单独管道的读取端(同样在/var/run中),从中读取(阻塞),并将数据传递回主线程,以便通过tty进行写操作 使用互斥锁结构在这些对象之间共享数据。我还有一个测试客户端程序来处理这个问题的另一端。权限/文件访问权限有效 在bash中运行时,这似乎非常有效 不过,我想通过Valgrind,特别是memche

我有一个C服务器程序,它创建并打开命名管道(in/var/run)的写入端,并中断tty uart的SIGIO信号,将数据从该接口推送到管道中

这个程序还生成一个辅助pthread,它打开一个单独管道的读取端(同样在/var/run中),从中读取(阻塞),并将数据传递回主线程,以便通过tty进行写操作

使用互斥锁结构在这些对象之间共享数据。我还有一个测试客户端程序来处理这个问题的另一端。权限/文件访问权限有效

在bash中运行时,这似乎非常有效

不过,我想通过Valgrind,特别是memcheck和helgrind工具,加倍确保内存泄漏和线程错误。但当我在valgrind中启动服务器程序时,它会挂起,在客户端启动时不会运行。在程序开始时,我甚至没有从服务器上看到我的初始启动printf。Valgrind就坐在那里,直到我杀了它

我使用以下选项运行:

valgrind --tool=helgrind ./server

输出如下(对于两个命令):

正在抑制undef值错误,因为ld.so有一个吨,并且它淹没了我的输出

你能想到我做错了什么吗?可能是ld库中缺少调试信息?如果需要,我可以转储代码,或者进一步详细说明


谢谢。

您的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。那么
来自glibc,这是大约五年的工具链开发,谁知道在编译glibc时使用的gcc和binutils版本有什么改进。

啊,你完全正确。看起来Raspbian回购协议中的那个已经很旧了,手臂支撑似乎也很新。当前正在生成要测试的最新版本。谢谢顺便说一句,就是这样。建立并安装了3-13-0,现在运行良好。
==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
==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