休眠结束后,执行SQL语句时(insert)Sqlite出错

蠓虫带着秤砣飞 2018-08-13 02:33:00
使用的是C++的SQLite库。
出错是抛出了一个异常:
未处理的异常: 0xC0000005: 读取位置 0x69676562 时发生访问冲突
调用栈里面看在某些地方(SQLlite库内部)SQL语句变成了NULL,但调用的前几层明显不是NULL。
...全文
245 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-08-14
  • 打赏
  • 举报
回复
百度搜“如何设计对休眠友好的程序”
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
百度搜“如何设计对休眠友好的程序”

感谢赵老师了,虽然搜了一下,还没有找到很有直接帮助的东西,但确实是一个方向。
我前面一直搜休眠引起程序崩溃,也没有找到合适的。
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
"我传入的语句时对的,在某些位置会变成NULL,原因不明。。。"
你不会在内存中保存你传入语句的地址或地址的地址处设置数据改变断点,然后运行,看到底是哪儿的代码或汇编指令修改使之变成NULL吗?

Dump设定了断点也不会停下来。。。
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
"我传入的语句时对的,在某些位置会变成NULL,原因不明。。。"
你不会在内存中保存你传入语句的地址或地址的地址处设置数据改变断点,然后运行,看到底是哪儿的代码或汇编指令修改使之变成NULL吗?

问题无法重现,只是偶尔在休眠接收后才会出现,手动休眠,唤醒,有1%的概率出现,目前只有DUMP分析调用栈。DUMP运行的时候没有办法设定断点。
调用栈中显示了,在什么地方变成了NULL,但是那块的语句完全看不出问题。。。。。
赵4老师 2018-08-13
  • 打赏
  • 举报
回复
"我传入的语句时对的,在某些位置会变成NULL,原因不明。。。"
你不会在内存中保存你传入语句的地址或地址的地址处设置数据改变断点,然后运行,看到底是哪儿的代码或汇编指令修改使之变成NULL吗?
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
学会使用数据断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}

Linux下可以使用gdb的watch命令。

这个好像和我的问题不相关。。
好吧,我的这个问题,还没有办法能保证重现。就是偶尔出现。。。。所以没有办法跟踪调试,只能看dump猜。。。
赵4老师 2018-08-13
  • 打赏
  • 举报
回复
学会使用数据断点:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}

Linux下可以使用gdb的watch命令。
  • 打赏
  • 举报
回复
引用 6 楼 Slzde_sub 的回复:


按我的做法就是看内存和堆栈。。直接捕捉上一次异常

调用栈,看了,有问题的地方,是sqlite源码部分,感觉不大可能。所以没有太细的去看。其实是即使发现了问题,也不知道怎么改。。。
就是想问问大家有没有遇到过这类的情况?
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

分析调用栈应当算是比较老手的级别了,但是这个错误的调用栈仍然不知道怎么下手。。。
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

已经分析调用栈了。。。
出错的地方是sqlite源码里面的内容。我传入的语句时对的,在某些位置会变成NULL,原因不明。。。
还有就是,调用栈的定位不准,很多都定位到了注释的地方。。。我是手动找到位置的。
赵4老师 2018-08-13
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
  • 打赏
  • 举报
回复
引用 1 楼 Slzde_sub 的回复:

敢不敢贴下代码。

这一句出的错。

stmt = _db.compileStatement(L"REPLACE INTO offline (guid, begin, end, time, remain, state) VALUES (?, '0', '0', ?, ?, ?);");
  • 打赏
  • 举报
回复
引用 1 楼 Slzde_sub 的回复:

敢不敢贴下代码。


if (IsValid())
{
return false;
}

CppSQLite3Statement stmt;
// 分钟转为秒
int seconds = time * 60;

// 删除之前的临时授权
RemoveTempCert();

stmt = _db.compileStatement(L"REPLACE INTO offline (guid, begin, end, time, remain, state) VALUES (?, '0', '0', ?, ?, ?);");
stmt.bind(1, L"tempoffline");
stmt.bind(2, seconds);
stmt.bind(3, seconds);
stmt.bind(4, 1);
stmt.execDML();
stmt.finalize();

64,647

社区成员

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

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