c++ - 字符串分配中的代码转储

标签 c++ multithreading string crash centos

我在以下代码部分获取核心转储:

void Debug::writeToFile()
{
 _ptrMutex->getLock();
 write(_fd,_cacheStr.c_str(),_cacheStr.size());
 _cacheStr = ""; //flush the write string
 _ptrMutex->releaseLock();
}

核心发生一次,stack dump如下

Thread 1 (Thread 8426):
#0  0x00a2a402 in __kernel_vsyscall ()
#1  0x0072bdf0 in raise () from /lib/libc.so.6
#2  0x0072d701 in abort () from /lib/libc.so.6
#3  0x0545651a in ?? () from /usr/lib/libstdc++.so.6
#4  0x05456552 in std::terminate() () from /usr/lib/libstdc++.so.6
#5  0x0545668a in __cxa_throw () from /usr/lib/libstdc++.so.6
#6  0x053ed1ef in std::__throw_length_error(char const*) () from /usr/lib/libstdc++.so.6
#7  0x0543211d in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) () from /usr/lib/libstdc++.so.6
#8  0x05433e28 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned int, unsigned int, unsigned int) () from /usr/lib/libstdc++.so.6
#9  0x05433fca in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) () from /usr/lib/libstdc++.so.6
#10 0x05434065 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*, unsigned int) () from /usr/lib/libstdc++.so.6
#11 0x0815e9a8 in Debug::writeToFile() ()
#12 0x08161866 in Debug::LOG_PRINT_ERROR(char*, ...) ()
#13 0x0812bcc6 in DimInternalMsgHandler::handlePeerStatusIndication(DimPeerStatusInd*) ()
#14 0x0812c52a in DimInternalMsgHandler::handleInternalMessage(unsigned char*, int) ()
#15 0x0812aa05 in DimDanIfController::handleInMessage(NwPacket&) ()

最佳答案

我怀疑问题出在 writeToFile() 本身。

我可以看到几种可能性:

  1. 第一种可能性是 _cacheStr 已损坏,可能是由于其他地方的内存错误。

  2. 第二种可能性是_cacheStr 被另一个线程并发修改。我可以看到 writeToFile() 受互斥锁保护,但任何其他可以修改 _cacheStr 的地方都需要做同样的事情。

关于c++ - 字符串分配中的代码转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9062858/

相关文章:

c++ - 使用 std::shared_ptr 的 std::map 调用 const 重载函数

c++ - 在 C++ 中,使用初始化列表的定义和原始类型的 '=' 字符之间有什么区别吗?

c++ - 在哪些情况下我需要锁定变量以防止同时访问?

C++ 初始化列表和默认值

multithreading - 如果 goroutines 涉及用户空间线程,阻塞操作是否会导致整个线程的上下文切换?

java - 如何在Java中不使用循环将String数组转换为int数组

php - 使用 preg_replace 使序号全部小写

c++ - 访问其他线程堆栈变量如何在 C++ 中工作?

java - 多生产者单消费者队列,无专用消费者线程

Java 字符串转换为十六进制