处理无效指针的崩溃

Crashes dealing with invalid pointers

本文关键字:崩溃 指针 无效 处理      更新时间:2023-10-16

当我试图使用GDB调试服务器代码时,有时会得到一个对我来说毫无意义的堆栈跟踪。

示例:

  1. 函数的参数值,因为调用该函数的代码阻止了无效值,所以该参数值应该是不可能的。

  2. 迭代映射时崩溃,应该保证映射中的所有值都是有效的。

我的问题如下:

一个无效的指针(一个已经删除但仍在使用的指针,就像它是有效的一样(有可能破坏其他本来可以正常使用的代码吗?一个无效的指针会不会以某种方式扰乱std::映射内部的内存,即使指针与std::map无关?基本上,如果你的指针指向某个随机内存并对其进行操作,它是否可能使程序中的任何内容无效?

是的,如果你的指针真的很糟糕,那么几乎任何事情都可能发生。但也有可能是GDB未能正确重建执行状态,可能是因为堆栈已损坏,也可能是因为某些值已被优化而不存在。

恢复堆栈的难易程度取决于使用的处理器和该平台的ABI。如果你陈述了这些事情,也许还举了一个例子,那么可能会更明确。

这里有一个调试技巧:如果可以的话,在接近崩溃点之前,停止程序的执行,然后查看堆栈。记住一些相关对象的内存地址。然后,当程序执行得更深一点时,转储掉这些相同的对象,看看它们是否发生了变化。这将使您有信心相信堆栈跟踪中的哪些值。

是的,这是可能的。指针如果未初始化、删除但随后使用,则具有随机值,如果在其指针位置进行写入,则可以覆盖代码的任何部分或内存中的任何内容。此外,如果您定义的内存区域对于其数据来说太小,您可以覆盖程序/内存中的任何类型的代码。

作为C/C++程序员,你经常会遇到神秘的崩溃和核心转储,这通常是因为你试图使用无效的指针。