我无法在gdb中转储pthread_mutex_t的struct members值以检测死锁
(gdb) where
#0 boost::mutex::lock (this=0x7fffffffd980) at mutex.hpp:116
#1 0x000000000043454b in boost::unique_lock<boost::mutex>::lock (this=0x7fffffffd970) at lock_types.hpp:346
#2 0x0000000000434591 in unique_lock (this=0x7fffffffd970, m_=@0x7fffffffd980) at lock_types.hpp:124
(gdb) print m
$21 = 0x802418880
(gdb) print &m
$22 = (pthread_mutex_t *) 0x7fffffffd980
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd".
testapp.cpp的来源
boost::mutex cn_mutex;
boost::mutex::scoped_lock lock(cn_mutex);
mystruct st;
st.id = 888;
while(true)
{
usleep(1000 * 2000);
}
std::cout << "done \n";
return 0;
编译参数:
/usr/bin/c++ -g -Wno-unknown-pragmas -Wno-sign-compare -g -pg CMakeFiles/testinterproc.dir/testapp.cpp.o -o testinterproc /usr/local/lib/libssl.so /usr/local/lib/libcrypto.so /usr/local/lib/libexecinfo.so /usr/local/lib/liblog4cplus.so -lpthread /home/xgps_app/thirdparty/boostlib1_64_0/lib/libboost_iostreams.a /home/xgps_app/thirdparty/boostlib1_64_0/lib/libboost_system.a /home/xgps_app/thirdparty/boostlib1_64_0lib/lib/boost_thread.a /home/xgps_app/thirdparty/boostlib1_64_0 /home/xgps_app/thirdparty/boostlib1_64_0/lib/libboost_filesystem.a -Wl,-rpath,/usr/local/lib
OS 9.0-RELEASE FreeBSD 9.0-RELEASE#1:amd64
请帮忙!
谢谢!
答案 0 :(得分:0)
从第
行开始boost::mutex::lock (this=0x7fffffffd980) at mutex.hpp:116
我们可以推断地址0x7fffffffd980
处的对象类型为boost::mutex
。
然后似乎将boost::mutex
投射到pthread_mutex_t
这是一个坏主意。 (或者,gdb
可能知道位于0
类型内的偏移boost::mutex
的子对象的实际类型。但该字段是私有的。)
即使您找到属于boost::mutex
类型的pthread_mutex_t
的正确私有成员,您仍然不应该依赖其中特定于实现的值。由于某种原因,它没有记录(实施可能会有所不同,可能会有所改变等)。
如果您需要/需要调试死锁,我建议您使用线程测试(-fsanitize=thread
,DRD或Helgrind)。