• 3691阅读
  • 8回复

下标越界导致的崩溃怎么定位触发的代码行数? [复制链接]

上一主题 下一主题
离线apud
 

只看楼主 倒序阅读 楼主  发表于: 2020-03-17
新手写的软件各种不稳定,应该是家常便饭的事情,本人也属于这一范围 ,偶尔折腾下Qt,业余爱好者。
软件崩溃的原因,内存泄漏、未初始化、下标越界应该是常见的原因之一。前段时间给软件加上的日志保存上报系统的功能,
以下是软件近期捕获到的日志:
Fatal: File:(global\qglobal.cpp) Line:(2127) ASSERT: "uint(i) < uint(size())" in file D:\Qt\Qt5.3.2\5.3\mingw482_32\include/QtCore/qstring.h, line 788 (2020-03-16 22:07:44 周一)
很明显是QString访问下标越界了,不过从这个报错信息,找不到代码调用方是第几行。代码中涉及QString下标访问的有几十处……正常使用中根本找不到,也触发不到,只有在某种场合下可能会遇到。没有精确的报错行数,无法定位问题
求各位大神解惑!感激不尽!
离线liulin188

只看该作者 1楼 发表于: 2020-03-17
楼主这种报错信息是怎么生成的,能不能教教我
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线firebolt

只看该作者 2楼 发表于: 2020-03-18
查看看调用栈啊
离线apud

只看该作者 3楼 发表于: 2020-03-18
回 liulin188 的帖子
liulin188:楼主这种报错信息是怎么生成的,能不能教教我[表情] [表情] [表情]  (2020-03-17 22:37) 

就是qtDebug信息重向件到文件。
离线apud

只看该作者 4楼 发表于: 2020-03-18
回 firebolt 的帖子
firebolt:查看看调用栈啊 (2020-03-18 18:23) 

objdump 生成asm的方式,根据报错地址去找倒是可以定位到引起异常的代码,不过这种对下标越界的无效,只能处理/0  等等异常信息。还有其它方便的方法吗?前提是软件已经打包出去给用户使用了,而不是在调试界面。这方面了解不是很多,可以指导下吗
离线firebolt

只看该作者 5楼 发表于: 2020-03-18
回 apud 的帖子
apud:objdump 生成asm的方式,根据报错地址去找倒是可以定位到引起异常的代码,不过这种对下标越界的无效,只能处理/0  等等异常信息。还有其它方便的方法吗?前提是软件已经打包出去给用户使用了,而不是在调试界面。这方面了解不是很多,可以指导下吗 (2020-03-18 19:54) 

看你的描述是随机错误,你要检查一下代码了,几十处真不算多啊。QString使用的是COW机制,下标操作有两种状态,一种是读,一种是写,估计你的问题是出在读操作上了。代码里加上异常捕获,然后写日志查一下吧。最终还是要改代码的。
离线stlcours

只看该作者 6楼 发表于: 2020-03-18
QString是可重入的:
https://doc.qt.io/archives/qt-4.8/threads-reentrancy.html

所以不存在下标越界的问题。根本问题还是在于这个QString被销毁了(多个线程在不加锁的情况下,试图使用同一个QString),而你还想继续使用,相当于还是野指针的问题。
离线newworker

只看该作者 7楼 发表于: 2021-12-27
回 apud 的帖子
apud:就是qtDebug信息重向件到文件。 (2020-03-18 19:47) 

大佬,qDebug如何记录系统错误信息,你这个看起来像是崩溃信息,qDebug不是都只能记录源代码错误信息吗,如何记录系统错误信息。
离线snow_man_0

只看该作者 8楼 发表于: 2022-01-01
下标越界这种低级错误,怎么定位?最简单的办法是谁写的代码,扣谁的工资
快速回复
限100 字节
 
上一个 下一个