std::map.find()崩溃,求助

柳鲲鹏 2019-01-10 06:18:23
std::map<const char*, GhMemoryRecord*>::iterator funcIter = g_oMemoryRecordFunctionMap.find(pFuncKey);
开始一段时间还好,过了一段时间就崩溃了。
不会是线程问题,访问之前加了线程锁。
...全文
2151 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
柳鲲鹏 2020-05-08
  • 打赏
  • 举报
回复
引用 21 楼 shl_Ahnxoyg的回复:
楼主这个问题解决没,我现在遇到了同样的问题,而且是单线程里面,map::find 程序就崩溃了,linux环境
没有解决。后来使用线程将就
shl_Ahnxoyg 2020-05-08
  • 打赏
  • 举报
回复
楼主这个问题解决没,我现在遇到了同样的问题,而且是单线程里面,map::find 程序就崩溃了,linux环境
mirro 2019-01-25
  • 打赏
  • 举报
回复
线程没有加锁吧?
柳鲲鹏 2019-01-25
  • 打赏
  • 举报
回复
引用 18 楼 才不是本人 的回复:
没看到有问题的代码,就重新编译, 有时候是编译器的问题

哈哈,即使没有问题,吾代码一天也会编译十次。
其实这个问题吾目前可以肯定就是线程问题。为什么是线程问题?应该是调用函数的线程,有一些特殊属性。
才不是本人 2019-01-25
  • 打赏
  • 举报
回复
没看到有问题的代码,就重新编译, 有时候是编译器的问题
柳鲲鹏 2019-01-25
  • 打赏
  • 举报
回复
引用 16 楼 mirro 的回复:
线程没有加锁吧?

当然有加锁
柳鲲鹏 2019-01-24
  • 打赏
  • 举报
回复
引用 14 楼 赵4老师 的回复:
[quote=引用 13 楼 柳鲲鹏 的回复:]
[quote=引用 12 楼 赵4老师 的回复:]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

不是WINDOWS,是LINUX[/quote]
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
[/quote]
看到了也解决不了。关键在于,吾这样写,哪里导致其崩溃?用法上哪里不对?
赵4老师 2019-01-23
  • 打赏
  • 举报
回复
引用 13 楼 柳鲲鹏 的回复:
[quote=引用 12 楼 赵4老师 的回复:] 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
不是WINDOWS,是LINUX[/quote] 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
柳鲲鹏 2019-01-22
  • 打赏
  • 举报
回复
引用 12 楼 赵4老师 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

不是WINDOWS,是LINUX
赵4老师 2019-01-22
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
柳鲲鹏 2019-01-22
  • 打赏
  • 举报
回复
就往map中放东西,哪里有什么高科技。代码很简单:

int gh_memory_record_increase(const void* pAddr, const int nSize,
const char* pFile, const char* pFunction, const int nLine)
{
#if MEMORY_TRACE_FLAG
if (pAddr == NULL)
{
//GH_LOG_INFO("addr=NULL, postion=%s-%s(%d)", pFile, pFunction, nLine);
return -1;
}

pthread_mutex_lock(g_pMemoryMutex);

//if (strstr(pFunction, "gh_mysql_query_camera_function")) GH_LOG_INFO("size=%d, postion=%s-%s(%d)", nSize, pFile, pFunction, nLine);
if (g_lStartTime == 0)
{
g_lStartTime = TIMESTAMP();
}

char* pAddrKey = gh_memory_addr_to_key(pAddr);

GhMemoryRecord* pAddrRecord = (GhMemoryRecord*)malloc(sizeof(GhMemoryRecord));
memset(pAddrRecord, 0, sizeof(GhMemoryRecord));
pAddrRecord->addr = (void*)pAddr;
pAddrRecord->time = TIMESTAMP();

pAddrRecord->size_total = nSize;
pAddrRecord->size_list[0] = nSize;
pAddrRecord->size_count = 1;

sprintf(pAddrRecord->file, "%s", pFile);
sprintf(pAddrRecord->function, "%s", pFunction);
pAddrRecord->line = nLine;

g_oMemoryRecordAddressMap[pAddrKey] = pAddrRecord;
//GH_LOG_INFO("addr=%s, size=%d, postion=%s-%s(%d)", pKey, nSize, pFile, pFunction, nLine);

#if MEMORY_TRACE_FUNCTION_MAP
char* pFuncKey = gh_memory_ffl_to_key(pFile, pFunction, nLine);

//第二次死在这里,为什么?
GH_LOG_HERE();
std::map<char*, GhMemoryRecord*, cmp_str>::iterator funcIter = g_oMemoryRecordFunctionMap.find(pFuncKey);
GH_LOG_HERE();
if (funcIter == g_oMemoryRecordFunctionMap.end())
{
GhMemoryRecord* pFuncRecord = (GhMemoryRecord*)malloc(sizeof(GhMemoryRecord));
memcpy(pFuncRecord, pAddrRecord, sizeof(GhMemoryRecord));
g_oMemoryRecordFunctionMap[pFuncKey] = pFuncRecord;
}
else
{
GhMemoryRecord* pFuncRecord = funcIter->second;
if (pFuncRecord == NULL)
{
GH_LOG_HERE();
}

pFuncRecord->size_total += nSize;
pFuncRecord->size_list[pFuncRecord->size_count] = nSize;
pFuncRecord->size_count ++;

free(pFuncKey);
}
#endif

pthread_mutex_unlock(g_pMemoryMutex);
#endif
return 0;
}
poy49295 2019-01-22
  • 打赏
  • 举报
回复
最好是能将能重现问题的代码段都贴出来。这样只有一条语句是很难定位问题的。
柳鲲鹏 2019-01-22
  • 打赏
  • 举报
回复
现在的解决思路有:
1、不使用map,自己进行搜索处理。
2、使用线程,将工作先加入线程中,由专用线程进行处理。
柳鲲鹏 2019-01-13
  • 打赏
  • 举报
回复
引用 3 楼 cwenhe0324 的回复:
是在find内部崩溃的嘛,如果改成string又加上锁了还有问题。那是不是用于查找的key值有问题呢。看不到源码都不好说什么情况的。

key是字串,函数名、10数字、16数字。
柳鲲鹏 2019-01-13
  • 打赏
  • 举报
回复
引用 6 楼 taodm 的回复:
柳大都搞不定的一定是神问题。不浪费时间想了。就搬板凳看吧。

不敢。
怀疑还是线程问题。改进办法是,将操作加入线程队列;由线程执行相应操作。
柳鲲鹏 2019-01-12
  • 打赏
  • 举报
回复
引用 4 楼 mengwuxiy 的回复:
大概率是其他地方的内存操作影响了map的存储结构

可以肯定不是:
1、有锁。释放时肯定不影响。
2、都是新建的。
mengwuxiy 2019-01-12
  • 打赏
  • 举报
回复
大概率是其他地方的内存操作影响了map的存储结构
taodm 2019-01-12
  • 打赏
  • 举报
回复
柳大都搞不定的一定是神问题。不浪费时间想了。就搬板凳看吧。
cwenhe0324 2019-01-11
  • 打赏
  • 举报
回复
是在find内部崩溃的嘛,如果改成string又加上锁了还有问题。那是不是用于查找的key值有问题呢。看不到源码都不好说什么情况的。
taodm 2019-01-11
  • 打赏
  • 举报
回复
存个string呗,别用char *。
加载更多回复(1)

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧