【发布时间】: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命令能够很好地向后跟踪堆栈帧。但我不知道为什么。