|
1
4
我觉得那个架子好像被炸了。对于缓冲区溢出,只需在一个小char[]中复制一个大字符串就可以了。这就抹去了回信地址。代码一直运行到返回,然后当它从堆栈中弹出一个坏地址时就会爆炸。或者更糟的是,如果地址恰好有效。 调试器无法显示任何有意义的内容,因为它无法遍历堆栈以显示代码是如何到达崩溃位置的。实际的坠机地点没有告诉你任何事情。 把凝灰岩当作钉子来调试。你必须让它可复制,你需要步进或跟踪找到最后一个已知的好功能。跳出程序后产生崩溃的是有错误的程序。实际上,您可以看到造成损害的语句,调试器调用堆栈突然变得紧张。如果你不能得到一个一致的复制,那么彻底的代码审查是剩下的一切。你可以通过称之为“安全审查”来证明时间的合理性。祝你好运。 |
|
|
2
5
首先确保您正在为发布版本构建构建符号(调试信息),并且调试器可以找到它们(这可能需要配置符号路径—最好是使用符号服务器)。 其次,在调试时使用Modules视图确认已加载符号。
|
|
3
5
如果代码在应用优化后崩溃(如在默认版本中),那么很可能您的代码在某种程度上有缺陷,并且依赖于未定义的行为,这些行为在版本和调试版本之间会发生变化。 尝试在发布版本中关闭优化以查看问题是否消失(或者在调试版本中打开优化以查看问题是否发生)。如果是这样的话,您仍然应该致力于找到并修复这个bug,但是您至少知道要寻找未定义的行为。 将编译器警告级别设置为最大值(/W4),并将警告设置为错误(/Wx)和 修理 所有的警告(而不是简单地把所有的东西都投在眼前——想想看!)。当应用优化时,您可能会得到在调试版本中没有出现的警告,因为执行了更广泛的代码分析—这是非常有用的静态分析。 如果您希望在优化的构建中打开调试,您可以这样做,但是您不太可能跟踪正在发生的事情,因为优化程序可能会重新排序代码,并删除代码和变量。 |
|
|
4
4
可以通过添加带有时间戳的日志输出来跟踪竞争条件。你首先要通过观察车祸发生前发生的事情来缩小“大解决方案”中问题的范围。一定要使用延迟日志机制——一种稍后或在另一个线程中执行字符串处理的机制,这样它本身就不会对计时产生太大的影响。 |
|
|
5
1
你知道你仍然可以调试发布版本吗?只需按F5键(而不是CTRL+F5)即可在调试中运行。 它是可重复的,也就是说,当它爆炸时,你是否在做一些具体的事情? 如果是这样的话,在崩溃之前在代码中设置一个断点,然后按F5在debug中运行(确保使用的是发行版)。然后逐步执行,直到你的应用程序崩溃。我发现这比添加日志记录和调试打印语句要快。 如果不是,在调试模式下运行有时会捕获错误并在有问题的行上停止。
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |