处理无效指针的崩溃

时间:2014-04-30 09:17:50

标签: c++ pointers

当我尝试使用GDB调试我的服务器代码时,我有时会得到一个似乎对我没用的堆栈跟踪。

示例:

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

  2. 在迭代地图时崩溃,应该保证地图中的所有值都有效。

  3. 我的问题如下:

    是否有可能无效的指针(已被删除但仍被使用,如果它有效)可能会破坏其他原本无效的代码?即使指针与std :: map无关,一个无效的指针会不会弄乱std :: map中的内存?基本上,如果你的指针指向某个随机内存并对其进行操作,它是否可能使程序中的任何内容无效?

2 个答案:

答案 0 :(得分:0)

是的,如果你的指针确实不好,那么几乎任何事情都可能发生。但是GDB也可能无法正确地重建执行状态,可能是因为堆栈已损坏,或者可能因为某些值已经优化而不存在。

恢复堆栈的难易程度取决于正在使用的处理器和该平台的ABI。如果你陈述了那些东西,并且可能给出了一个示例堆栈,那么它可能更加明确。

这是一个调试提示:如果可以的话,暂停程序的执行,但是在它到达崩溃的位之前,然后查看堆栈。记住相关对象的一些内存地址。然后,当程序更深入地执行它时,转储掉那些相同的对象,看看它们是否已经改变。这将使您确信应该相信堆栈跟踪中的哪些值。

答案 1 :(得分:0)

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

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