无法访问GDB中的pthread_mutex_t成员

Unable access to pthread_mutex_t members in GDB

本文关键字:mutex 成员 pthread 中的 访问 GDB      更新时间:2023-10-16

我无法将pthread_mutex_t的struct成员置于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, 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释放freebsd 9.0释放#1:AMD64
请帮忙!谢谢!

来自该行

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

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

然后看来将boost::mutex铸造为pthread_mutex_t,这是一个坏主意。(另外,可能是gdb知道位于boost::mutex类型内部偏移0的实际类型的sub-object类型。仍然,该字段是私有的)。

即使您找到了boost::mutex类型的CC_8的正确私人成员,那么您仍然不应依靠其中的实现值。它没有证明是有原因的(实现可能有所不同,可能会更改等)

我建议使用线程测试(-fsanitize=thread,DRD或Helgrind),如果您需要/需要调试僵局。