无法访问GDB中的pthread_mutex_t成员

时间:2017-09-07 04:37:59

标签: c++ boost gdb mutex freebsd

我无法在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_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
请帮忙! 谢谢!

1 个答案:

答案 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)。