是的,我相信这个问题已经被含蓄地回答了很多次,但我似乎不能完全理解它。
如果您有一个(x86)堆栈跟踪(例如,在WinDbg中查看它),并且您查看了寄存器,那么eBP值和ESP值相隔x个字节意味着什么?
链接:
举一个我最近的堆栈跟踪的例子:
0:016> k
ChildEBP RetAddr
1ac5ee8c 76b831bb ntdll!NtDelayExecution+0x15
1ac5eef4 76b83a8b KERNELBASE!SleepEx+0x65
1ac5ef04 0060e848 KERNELBASE!Sleep+0xf
1ac5ef10 76859d77 MyApp!application_crash::CommonUnhandledExceptionFilter+0x48 [...\applicationcrash.inc.cpp @ 47]
1ac5ef98 775a0df7 kernel32!UnhandledExceptionFilter+0x127
1ac5efa0 775a0cd4 ntdll!__RtlUserThreadStart+0x62
1ac5efb4 775a0b71 ntdll!_EH4_CallFilterFunc+0x12
1ac5efdc 77576ac9 ntdll!_except_handler4+0x8e
1ac5f000 77576a9b ntdll!ExecuteHandler2+0x26
1ac5f0b0 7754010f ntdll!ExecuteHandler+0x24
1ac5f0b0 6e8858bb ntdll!KiUserExceptionDispatcher+0xf
1ac5f400 74e68ed7 mfc80u!ATL::CSimpleStringT<wchar_t,1>::GetString [f:\dd\vctools\vc7libs\ship\atlmfc\include\atlsimpstr.h @ 548]
1ac5fec0 6e8c818e msvcr80!_NLG_Return [F:\dd\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm @ 73]
1ac5ff48 74e429bb mfc80u!_AfxThreadEntry+0xf2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 109]
1ac5ff80 74e42a47 msvcr80!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
1ac5ff88 76833677 msvcr80!_threadstartex+0x66 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
1ac5ff94 77569f02 kernel32!BaseThreadInitThunk+0xe
1ac5ffd4 77569ed5 ntdll!__RtlUserThreadStart+0x70
1ac5ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
0:016> r
eax=00000000 ebx=1ac5efc8 ecx=19850614 edx=00000000 esi=1ac5eed0 edi=00000000
eip=7754fd21 esp=1ac5ee8c ebp=1ac5eef4 iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
ESP 1ac5ee8c
- EBP 1ac5eef4
的值=104byte差。那里面是什么?
发布于 2013-02-22 09:29:59
ESP是当前的堆栈指针。EBP是当前堆栈帧的基指针。
调用函数时,通常会在堆栈上为局部变量保留空间。此空间通常通过EBP引用(在函数调用期间,所有局部变量和函数参数都是此寄存器的已知常量偏移量)。另一方面,ESP将在函数调用期间发生变化,因为其他函数被调用,或者临时堆栈空间用于部分操作结果。
请注意,如今大多数编译器都可以选择通过ESP引用所有局部变量。这释放了EBP,以便用作通用寄存器。
一般来说,当你查看函数顶部的反汇编代码时,你会看到如下所示:
push EBP
mov EBP, ESP
sub ESP, <some_number>
因此,EBP将指向此帧的堆栈顶部,而ESP将指向堆栈上的下一个可用字节。(堆栈通常-但不一定-在内存中增长。)
发布于 2013-02-22 09:23:13
通常,此空间是为最终存储在堆栈上的局部变量保留的。在函数开始时,ESP
递减适当的值。
在您的例子中,函数中有104个字节的局部变量。
https://stackoverflow.com/questions/15020621
复制相似问题