gpt4 book ai didi

debugging - ESP 和 EBP 之间是什么?

转载 作者:行者123 更新时间:2023-12-03 08:51:51 26 4
gpt4 key购买 nike

是的,我敢肯定这是隐含地回答了很多次,但我似乎无法完全理解它。

如果您有一个 (x86) 堆栈跟踪(例如,在 WinDbg 中查看它),并且您查看了寄存器,那么 EBP 和 ESP 值相距 x 字节意味着什么?

链接:

  • https://stackoverflow.com/a/3699916/321013
  • https://stackoverflow.com/a/2466587/321013
  • https://stackoverflow.com/a/5738940/321013

  • 举一个我最近的堆栈跟踪的例子:
    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 = 104 字节差异。那么里面有什么?

    最佳答案

    ESP 是当前堆栈指针。 EBP 是当前堆栈帧的基指针。

    调用函数时,通常会在堆栈上为局部变量保留空间。这个空间通常通过 EBP 引用(所有局部变量和函数参数在函数调用期间都是一个已知的常量偏移量。)另一方面,ESP 会在函数调用期间随着其他函数的调用而改变,或作为临时堆栈空间用于部分运算结果。

    请注意,现在大多数编译器都可以选择通过 ESP 引用所有局部变量。这释放了 EBP 以用作通用寄存器。

    通常,当您查看函数顶部的反汇编代码时,您会看到如下内容:

    push EBP
    mov EBP, ESP
    sub ESP, <some_number>

    因此,EBP 将指向此帧的堆栈顶部,而 ESP 将指向堆栈中的下一个可用字节。 (堆栈通常 - 但不必 - 在内存中增长。)

    关于debugging - ESP 和 EBP 之间是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020621/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com