【问题标题】:How can the stack be broken at the very start of application如何在应用程序一开始就破坏堆栈
【发布时间】:2017-03-27 23:36:49
【问题描述】:

堆栈帧指针 (EBP) 应始终指向前一个堆栈帧正确的位置,但为什么在我的应用程序中不是这样!那将表明某些事情确实是错误的..难以置信!

我创建了多个简单的演示应用程序,其中堆栈指针始终指向前一个堆栈帧,但我无法理解为什么在此应用程序中不是这种情况,并且当我的应用程序刚刚启动时就会发生这种情况!

以下是我的调用栈

0:000> k
 # ChildEBP RetAddr  
00 0018fee4 6381d1cd acn!CAcnApp::InitInstance+0x41 [c:\acn-project\acn\acn.cpp @ 527]
01 0018fef4 00428575 MFC80U!AfxWinMain+0x48 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp @ 37]
02 0018ff88 765d336a acn!__tmainCRTStartup+0x150 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 589]
03 0018ff94 76f59902 kernel32!BaseThreadInitThunk+0xe
04 0018ffd4 76f598d5 ntdll!__RtlUserThreadStart+0x70
05 0018ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
0:000> dc 0018fee4 
0018fee4  ffffffff 6381d1cd 00489498 00000001  .......c..H.....
0018fef4  00000000 00428575 00400000 00000000  ....u.B...@.....
0018ff04  01e53fd2 0000000a 87b8aee0 00000000  .?..............
0018ff14  00000000 7efde000 00000044 01e54012  .......~D....@..
0018ff24  01e53ff2 01e53fd4 00000000 00000000  .?...?..........
0018ff34  00000000 00000000 00000000 00000000  ................
0018ff44  00000000 00000000 00000000 00000000  ................
0018ff54  00000000 00000000 0018ff84 00428e5d  ............].B.
0:000> dc 0018fef4 
0018fef4  00000000 00428575 00400000 00000000  ....u.B...@.....
0018ff04  01e53fd2 0000000a 87b8aee0 00000000  .?..............
0018ff14  00000000 7efde000 00000044 01e54012  .......~D....@..
0018ff24  01e53ff2 01e53fd4 00000000 00000000  .?...?..........
0018ff34  00000000 00000000 00000000 00000000  ................
0018ff44  00000000 00000000 00000000 00000000  ................
0018ff54  00000000 00000000 0018ff84 00428e5d  ............].B.
0018ff64  01e53fd2 00000000 00000000 0018ff0c  .?..............
0:000> dc 0018ff88 
0018ff88  0018ff94 765d336a 7efde000 0018ffd4  ....j3]v...~....
0018ff98  76f59902 7efde000 7d7a657d 00000000  ...v...~}ez}....
0018ffa8  00000000 7efde000 00000000 00000000  .......~........
0018ffb8  00000000 0018ffa0 00000000 ffffffff  ................
0018ffc8  76f958c5 0b965c89 00000000 0018ffec  .X.v.\..........
0018ffd8  76f598d5 0042873d 7efde000 00000000  ...v=.B....~....
0018ffe8  00000000 00000000 00000000 0042873d  ............=.B.
0018fff8  7efde000 00000000 78746341 00000020  ...~....Actx ...

控件位于InitInstance() 的第一行,所以就像我的应用程序第一次呼吸一样,堆栈似乎已经损坏了?好吧,应用程序类构造函数在此之前,但我检查了调用堆栈在那里也处于类似状态。

请注意堆栈帧指针 (EFP) 检查第 1 帧和第 2 帧均失败,但堆栈除此之外还不错。

我的第一个问题是调用堆栈可以是这样的有什么解释吗?换句话说,我们可以说调用堆栈肯定坏了吗?该应用程序确实会加载并调用各种 dll,如果这可能会起到任何作用(但不知道为什么会这样)。

由于应用程序才刚刚启动,这种情况下的嫌疑人可能是什么!?

更新(代码)

这是非常简单的构造函数。至于InitInstance(),这个函数很长,但我的断点在第一行,所以当调用堆栈这样时,它的代码永远不会执行。

CAcnApp::CAcnApp()
{
    m_bServMode = FALSE;
    m_bFactory = FALSE;
    m_bDownload = FALSE;
    m_pEngine = NULL;
    m_hWiztomMod = NULL;
    m_pServer = new CAcnServer;
}

第二次更新

我在进一步调查后发布了后续question 以分享额外信息,由于存在差异,这确实符合单独的问题。

【问题讨论】:

  • 贴一些代码。
  • @NeilButterworth 我发布了到目前为止已执行的代码,并在帖子中添加了我的 cmets。
  • 我不清楚是什么让您认为堆栈帧已损坏?
  • @HarryJohnston 不应该 dc 0018fee4 指向 0018fef4?它反而指向ffffffff
  • 我必须假设它没问题,因为k 命令能够很好地向后跟踪堆栈帧。但我不知道为什么。

标签: c++ mfc windbg


【解决方案1】:

顺便说一句,全局或文件全局对象是在调用 main 函数之前创建的。

如果对象的构造函数有问题,您可以看到在调用 main 之前发生了任意数量的缺陷。

查看对象的构造函数。您应该能够在对象的构造函数中设置断点。

编辑 1:构造函数中的内存分配
拥有具有动态内存分配的全局对象可能会导致问题。该对象要求在构造对象之前初始化动态内存分配。尝试注释掉动态内存分配,看看问题是否消失。

一种解决方法是创建一个可以在到达main 入口点后调用的“初始化”方法。 initialize 方法将执行动态内存分配。

【讨论】:

  • 我会检查它,但我已经评论了在上面的构造函数中创建的一个对象,但这并没有解决问题。
猜你喜欢
  • 2011-10-05
  • 2011-04-22
  • 2018-05-23
  • 1970-01-01
  • 2011-01-06
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多