如何在 ThreadSanitizer 堆栈跟踪中查找行号

How to find line number in ThreadSanitizer stack trace

我使用带有 -g3-O1 标志的 Clang 进行编译,但 TSan 抱怨它发现了数据争用并且它输出了一个完全模糊的堆栈跟踪,没有明确的行号。

在这种情况下如何查找行号?

Pastebin 上的输出,因为 Stack Overflow 不支持超过 30k 个字符。

https://pastebin.com/raw/6izxznym

寻找“/home”以找到您的代码。

线程堆栈看起来不错,行号显示得很好。您的 MediaServer::initialize() 创建了线程 T1。

Thread T1 (tid=2667937, running) created by main thread at:
  #2 MediaServer::initialize /home/MediaServer/MediaServerMethods.cpp:1808
  #3 main /home/MediaServer/MediaServer.cpp:33

T1 继续初始化 MediaServer 并创建线程 7。

Thread T7 (tid=2667963, running) created by thread T1 at:
  #31 SimpleWeb::SocketServerBase<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::executor> >::start() /usr/local/include/simple-websocket-server/server_ws.hpp:437
  #32 MediaServer::initialize()::$_7::operator()() const /home/MediaServer/MediaServerMethods.cpp:1812

T7 收到了一些消息并调用了您的代码,它正在创建 std::shared_ptr,也许正在从 C 字符串创建一些 std::string

Previous write of size 8 at 0x7b1800006060 by thread T7:
  #1 void std::__cxx11::basic_string<char>::_M_construct<char*>(char*, char*, std::forward_iterator_tag) /usr/include/c++/11/bits/basic_string.tcc:219
  #2 rtc::impl::Certificate::Certificate()
  ...
  #8 std::make_shared<rtc::PeerConnection>() /usr/include/c++/11/bits/shared_ptr.h:876
  #9 RTCTransport::createPeerConnection() /home/MediaServer/MediaServerMethods.cpp:458
  #10 MediaServer::initialize()::$_5::operator()(...) const /home/MediaServer/MediaServerMethods.cpp:1761

最后,线程 T1 试图在不使用锁守卫的情况下构建相同的 std::string

WARNING: ThreadSanitizer: data race (pid=2667935)
  Read of size 8 at 0x7b1800006060 by thread T1:
    #1 void std::__cxx11::basic_string<char>::_M_construct<char*>(char*, char*, std::forward_iterator_tag) /usr/include/c++/11/bits/basic_string.tcc:225
    #2 rtc::impl::Certificate::fingerprint[abi:cxx11]() const
    ...
    #24 MediaServer::initialize()::$_7::operator()() const /home/MediaServer/MediaServerMethods.cpp:1812