无法访问pthread_mutex_t成员GDB

问题描述:

我无法倾倒pthread_mutex_t的结构成员的值在gdb为了检测死锁testapp.cpp的无法访问pthread_mutex_t成员GDB

(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, [email protected]) 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". 

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_iostre‌​ams.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_filesy‌​stem.a -Wl,-rpath,/usr/local/lib 

OS 9.0-RELEASE的FreeBSD 9.0-RELEASE#1:AMD64
请帮忙! 谢谢!

+0

你是如何编译你的代码的? – xaxxon

+0

请*编辑您的问题*以包括使用的命令。 –

+3

另请注意,pthread类型是[* opaque types *](https://en.wikipedia.org/wiki/Opaque_data_type)。你不应该知道他们的成员,或者访问他们。 –

从线

boost::mutex::lock (this=0x7fffffffd980) at mutex.hpp:116 

我们可以推断,该对象中的地址0x7fffffffd980类型是boost::mutex

这似乎是铸造boost::mutexpthread_mutex_t这是一个坏主意。 (或者,gdb可能知道位于boost::mutex类型内的偏移量为0的子对象的实际类型,但该字段仍然是私有的)。

即使你找到了boost::mutex正确私有成员是pthread_mutex_t类型,那么你仍然不应该依赖于具体的实现值在其中。由于某种原因(实现可能有所不同,它可能会改变等)

如果您想/需要调试死锁,我可以建议使用线程测试(-fsanitize=thread,DRD或Helgrind)。