程序代码太多没法贴,其功能是与下位机进行通信,其中用到了临界区,多线程,iocp。
代码出现异常后,调用堆栈只有:> 00000010()
在可疑的地方做了调试信息和日志,但还是找不到问题。
看了一些帖子说很可能是指针的问题,调试时也找到,问题是本人是在调用一个功能接口时连续调用多次,或是累计调用多次之后才会发生异常,单次调用时没问题,程序是在WSASendto执行之后 和进入workThread之间发生的异常,程序没有内存泄漏。
本人想问一下:
1 遇到这类问题一般怎么调试?
2 有没有什么易用的检查工具推荐一下?(windbg用了之后显示的信息也不明确)
3 程序死锁会出现这类问题吗?(会出现上面的异常?)
查了几天了,好纠结。
代码出现异常后,调用堆栈只有:> 00000010()
在可疑的地方做了调试信息和日志,但还是找不到问题。
看了一些帖子说很可能是指针的问题,调试时也找到,问题是本人是在调用一个功能接口时连续调用多次,或是累计调用多次之后才会发生异常,单次调用时没问题,程序是在WSASendto执行之后 和进入workThread之间发生的异常,程序没有内存泄漏。
本人想问一下:
1 遇到这类问题一般怎么调试?
2 有没有什么易用的检查工具推荐一下?(windbg用了之后显示的信息也不明确)
3 程序死锁会出现这类问题吗?(会出现上面的异常?)
查了几天了,好纠结。
解决方案
30
应该是内存访问越界的问题。多长时间崩溃一次?
直接debug运行,崩溃的时候就好看了
直接debug运行,崩溃的时候就好看了
20
这种低概率出错的BUG确实不好找,所以写代码要养成良好习惯
10
首先, 肯定是内存访问越界, 不要怀疑. 其次, 不要只在”可疑的地方”调试, 很有可能错在你认为不会出错的不起眼的地方.
调试的办法: 可以注释掉可能出错的地方, 怎么样这样运行不出错, 就确定了错误的范围. 逐渐缩小范围, 最终找到
调试的办法: 可以注释掉可能出错的地方, 怎么样这样运行不出错, 就确定了错误的范围. 逐渐缩小范围, 最终找到
10
可人为加快调用频率,加速崩溃。debug运行时,崩溃的时候调看调用栈,便于定位问题点。
也可以用http://blog.csdn.net/starlee/article/details/6630816中的方法,崩溃时打印调用栈。
或,逐步注释掉可能出问题的地方,逐步缩小问题范围
也可以用http://blog.csdn.net/starlee/article/details/6630816中的方法,崩溃时打印调用栈。
或,逐步注释掉可能出问题的地方,逐步缩小问题范围
10
以前遇到过这种问题,有野指针问题,也可能是越界
10
应该是野指针的问题,程序中是不是有随机数啊,上次碰到相似的情况是随机数产生的,有些随机数会造成越界情况
20
一般做项目时,加入生成Dump文件代码,在崩溃时可以调试Dump文件快速找到问题!
void CreateDumpFile(LPCSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithFullMemoryInfo, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
void CreateDumpFile(LPCSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithFullMemoryInfo, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}