C++ 处理无效指针的崩溃

C++ 处理无效指针的崩溃,c++,pointers,C++,Pointers,当我试图使用GDB调试我的服务器代码时,我有时会得到一个对我来说毫无意义的堆栈跟踪 示例: 函数的参数值,该值不可能,因为调用该函数的代码会阻止无效值 在迭代映射时崩溃,应确保映射中的所有值都有效 我的问题如下: 无效指针(一个已被删除但仍被当作有效指针使用的指针)是否有可能破坏其他本来可以处理的代码?即使指针与std::map无关,无效指针是否会以某种方式破坏std::map内的内存?基本上,如果您的指针指向某个随机内存并对其执行操作,是否可能使程序中的任何内容无效?是的,如果您的指针确实不正

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

示例:

  • 函数的参数值,该值不可能,因为调用该函数的代码会阻止无效值

  • 在迭代映射时崩溃,应确保映射中的所有值都有效

  • 我的问题如下:


    无效指针(一个已被删除但仍被当作有效指针使用的指针)是否有可能破坏其他本来可以处理的代码?即使指针与std::map无关,无效指针是否会以某种方式破坏std::map内的内存?基本上,如果您的指针指向某个随机内存并对其执行操作,是否可能使程序中的任何内容无效?

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

    恢复堆栈的难易程度取决于正在使用的处理器以及该平台的ABI。如果您陈述了这些内容,并给出了一个示例堆栈,那么可能会更明确

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

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


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

    在处理未定义的行为时,一切都是可能的。它取决于堆栈帧、覆盖的数据实体等。取消引用无效指针是未定义的行为。任何事情都可能发生,包括无效参数、迭代时崩溃、迭代时不崩溃,或者法国赢得下一届欧洲电视大赛。如果您还没有这样做,请使用valgrind。这是最好的工具。实际上,在现代虚拟内存系统中,重写代码是不可能的。代码页被映射到进程的只读地址。我的意思是地址空间。