【发布时间】:2016-08-26 09:27:10
【问题描述】:
背景
我有大约 1 TB 的原始数据文件,其中包含相对较小的标记数据子集。我编写了 c++ 代码(调用了一些我大量修改以使其在最近的编译器上编译的古老的 MSVC++2003 代码)来聚合带注释的数据切片。
标记数据的很大一部分集中在一个文件中,但结果证明该文件是我的程序崩溃的那个文件。
问题
我来了
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
terminate called after throwing an instance of 'int'
在我的 Qt 输出窗口中,windows 在弹出窗口中告诉我相同的信息,但此时从可执行文件/调试器中获取任何有用信息似乎为时已晚(尽管我对 Qt 完全没有经验调试器)。
我尝试过的
我用谷歌搜索了很多人,发现很多人都有这个错误消息,但它太笼统了,以至于他们的问题都不能和我的一样,而且有很长的不同 C 运行时函数列表可以筛选所有它们很慢,而且似乎没有帮助。
我的问题
“给一个人找一个bug,你帮他一天。教一个人调试,你帮他一辈子。在stackoverflow上发布方法,你帮助了很多人,得到了很多支持。”
是否有通用方法来查找问题所在的 C 运行时函数以及参数是什么?我错过了一些花哨的调试器功能吗?您还有什么可以推荐的或我可以提供的信息吗?
我希望得到一个包罗万象的答案来帮助每个人解决这个问题,不仅仅是我,但如果我也能得到帮助,我会很高兴。
针对我的问题:
我的堆栈跟踪如下:
0 ntdll!DbgBreakPoint 0x7727000d
1 ntdll!DbgUiRemoteBreakin 0x772ff156
2 ?? 0x6f06eaa1
3 KERNEL32!BaseThreadInitThunk 0x7501338a
4 ntdll!RtlInitializeExceptionChain 0x77299902
5 ntdll!RtlInitializeExceptionChain 0x772998d5
6 ??
而且 gdb 似乎无法获得更好的跟踪(我尝试用它做的任何事情都会导致超时错误)。
在尝试了更多功能以确保一切都超时后,再次尝试“回溯”确实给了我一个结果。我想我只是在 gdb 超时一次后从未在 gdb 中投入过这么多时间。
也就是说,我可能能够通过这些新信息找到一些东西。考虑我的具体问题已解决,但我相信我的一般观点仍然有效:我现在找到了有问题的函数(我认为),但不是为什么它是一个问题,也不是无效参数是什么。更好的是,我已经将它追踪到了一条写着“throw 1”的行。所以现在我假设 windows/Qt 将其转换为“无效参数”。但事实并非如此。
可能只是一些糟糕的代码,甚至不需要是 C 函数,也不需要你的参数有任何问题。
...
#17 0x00c17d72 in libstdc++-6!.cxa_throw () from C:\Qt\5.5\mingw492_32\bin\libstdc++-6.dll 没有可用的符号表信息。 ...
【问题讨论】:
-
Windows 弹出窗口出现的位置非常适合将调试器附加到进程 - 您应该会看到完整的堆栈跟踪。在附加之前不要关闭弹出窗口。
-
@AlanStokes 我什至尝试完全从 Qt 的调试器中运行它,但是 Qt 没有(或不知道)该文件的源代码,并向我展示了一些反编译的垃圾。我也没有得到堆栈跟踪。我会再次运行它来尝试截屏,也许我只是瞎了。
-
@AlanStokes 作为对您删除我的 C 标记的回应,我添加了它,因为它在技术上是 C++ 到 C 的通信错误(因为该错误专门引用“C 运行时函数”)。我不应该这样做吗?
-
你在问一个 C++ 程序; C 运行时包含在 C++ 中(有各种修改)。你不是在问C;你只是碰巧提到了它。
-
@AlanStokes:很公平,感谢您的澄清。