在 Windows x86-64 下,发生异常时,有多少内容被推送到 32 位堆栈上?

2023-12-14

In this 这个问题,我给出了一些我已经实现的并行语言的背景知识。编译器生成本机 x86-32 代码。

一个关键的实现决策是为每个函数(调用)从堆中分配堆栈空间。这允许递归直到你用完虚拟机,并为词法范围启用仙人掌堆栈,甚至对于嵌套的并行子项等也是如此。

编译器的代码生成器可以计算函数本身需要多少堆栈空间;这很混乱但很简单,而且它已经做得很好了。操作系统调用的堆栈需求没有问题;我的函数不做任何事情(如果需要,代码会切换到标准“大堆栈”,执行系统调用,然后切换回来)。为了安全地面对异常和异步调用,它向函数所需的堆栈空间添加了一个令人震惊的常量(目前约为 500 字节),旨在覆盖 x86-32 完整的上下文保存,根据 Windows 32 经验进行校准。

这种语言和异步异常处理在 x86-32 系统上都运行良好。我们在 x86-64 系统上运行这个 32 位实现时偶尔会遇到问题。我怀疑异常时堆栈溢出。

问题是,当在 Windows 64 机器上运行我的 32 位实现时,Windows 可以针对(除以零)硬件异常或 StopThread 调用向堆栈推送多少内容?我很担心 Windows 推送完整的 x86-64 上下文,它比 x86-32 上下文大得多。有人知道吗?有没有一个文档可以回答这一章的问题?

我准备进行一些动态实验来看看。


[回答完成;请参阅 Win32 Vista 和 Win64 Wow64 for Windows7 的具体值]

==========================================================================

运行于32位 Windows Vista,使用零除数进行 IDIV,我得到以下值:

EBP@div == x01C00800  // base of heap-allocated stack frame
ESP@div == x01C00FF8  // stack at "top" of allocated stack frame
ESP@entry to SEH  == 0x1C00C30 // ESP measured at first instruction of Structured Exception Handler
ContextOffset[ESP]== 0x1C00D2C // Pointer to context block at entry to SEH

因此,从分割点的 ESP=0x1C00FF8 到推送上下文块的底部,0x1C00FF8-0x1C00D2C = 0x2CC =716字节被推送。从推送上下文块的底部到 SEH 的条目,0x1C00D2C-0x1C00C30 = 0xFC ==252字节被推送。所以appears716+252 = 968 字节被推送(我觉得这很荒谬)。

情况变得更糟。接下来是 SEH 入口处堆栈帧的转储;请注意 0x1C00C30 以下到 0x1C00B78 之间的值(至少请参阅 0x1C00BD8 处的“明显的 Win32 返回地址”0x77c39534)cdcdcdcd;我相信 Windows 已经践行了这些价值观,同时将控制权交给了我的 SEH。即 0x1C00B78-0x1C00C30 = 0xB8 = 184 个额外字节。 (所以,可笑+难以置信)=1152需要字节才能到达 SEH,最小值。 [奇怪的是,由另一个线程执行的 Win32 ThreadStop 似乎会推动nothing在停止的线程堆栈上]

0x01C00800  01b002f0 00000001 cd4b1b19 cdcdcdcd cdcdcdcd 0000000b cdcdcdcd cdcdcdcd  ð.°.......KÍÍÍÍÍÍÍÍÍ....ÍÍÍÍÍÍÍÍ
0x01C00820  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00840  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00860  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00880  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C008A0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C008C0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C008E0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00900  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00920  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00940  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00960  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00980  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C009A0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C009C0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C009E0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00A00  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00A20  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00A40  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00A60  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00A80  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00AA0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00AC0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00AE0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00B00  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00B20  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd ffff0000 cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ..ÿÿÍÍÍÍ
0x01C00B40  00000035 00000034 00000001 cdcdcdcd cdcdcdcd f5f55f5f cdcdcdcd cdcdcdcd  5...4.......ÍÍÍÍÍÍÍÍ__õõÍÍÍÍÍÍÍÍ
0x01C00B60  cdcdcdcd cdcdcdcd ffff0000 cdcdcdcd cdcdcdcd 0190bfa8 52b396ac 52b396ac  ÍÍÍÍÍÍÍÍ..ÿÿÍÍÍÍÍÍÍͨ¿..¬–.R¬–.R
0x01C00B80  cdcdcdcd 0190bfa8 cdcdcdcd 00000011 00000000 01c00d18 cdcdcdcd cdcdcdcd  ÍÍÍͨ¿..ÍÍÍÍ..........À.ÍÍÍÍÍÍÍÍ
0x01C00BA0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00BC0  cdcdcdcd cdcdcdcd 00000000 cdcdcdcd 01c00c30 77c39534 cdcdcdcd 00000011  ÍÍÍÍÍÍÍÍ....ÍÍÍÍ0.À.4.ÃwÍÍÍÍ....
0x01C00BE0  00000000 01c00c30 77c39598 77c395b1 43e4d1f4 00000000 01c00d18 00456c00  ....0.À.˜.Ãw±.ÃwôÑäC......À..lE.
0x01C00C00  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd 00000000 00400000 01c00bf0 cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ......@.ð.À.ÍÍÍÍ
0x01C00C20  0184ff74 77c09aa2 35e18e8c 01c00c50 77c65dd9 01c00d18 0184ff74 01c00d2c  tÿ..¢šÀwŒŽá5P.À.Ù]Æw..À.tÿ..,.À.
0x01C00C40  01c00cec 0184ff74 77c65ded 0184ff74 01c00d00 77c65dab 01c00d18 0184ff74  ì.À.tÿ..í]Æwtÿ....À.«]Æw..À.tÿ..
0x01C00C60  01c00d2c 01c00cec 00456c00 00000000 01c00d18 0184ff74 77c39442 01c00d18  ,.À.ì.À..lE.......À.tÿ..B”Ãw..À.
0x01C00C80  0184ff74 01c00d2c 01c00cec 00456c00 7ffde08c 01c00d18 01b00300 cdcdcdcd  tÿ..,.À.ì.À..lE.Œàý...À...°.ÍÍÍÍ
0x01C00CA0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00CC0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x01C00CE0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd 00000072 01850000 0184c000 00cdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍr........À..ÍÍÍ.
0x01C00D00  01c00800 77c65c37 00c00d18 01c00d2c 01c00d18 01c00d2c c0000094 00000000  ..À.7\Æw..À.,.À...À.,.À.”..À....
0x01C00D20  00000000 023eb44c 00000000 0001003f 00000000 00000000 00000000 00000000  ....L´>.....?...................
0x01C00D40  00000000 00000000 ffff037b ffff2120 ffffffff 02383596 051f001b 02382ecc  ........{.ÿÿ !ÿÿÿÿÿÿ–58.....Ì.8.
0x01C00D60  ffff0023 00000000 c0000000 00004000 00000000 c000c000 00000000 80000000  #.ÿÿ.......À.@.......À.À.......€
0x01C00D80  0000c001 00000000 c0008000 00000000 c0000000 0000c001 00000000 c002e000  .À.......€.À.......À.À.......à.À
0x01C00DA0  00000000 80000000 00003fff 40000000 4010a51c 00000000 00000000 0000003b  .......€ÿ?.....@.¥.@........;...
0x01C00DC0  00000023 00000023 7ffde08c 01b00300 0190bfa8 00000000 00000000 00000063  #...#...Œàý...°.¨¿..........c...
0x01C00DE0  01c00800 023eb44c 0000001b 00010246 01c00ff8 00000023 2120037b 051f0000  ..À.L´>.....F...ø.À.#...{. !....
0x01C00E00  02383596 0000001b 02382ecc 00000023 00001f80 0000ffff 00000000 c0000000  –58.....Ì.8.#...€...ÿÿ.........À
0x01C00E20  00004000 00000000 00000000 c0000000 0000c000 00000000 00000000 80000000  .@.............À.À.............€
0x01C00E40  0000c001 00000000 00000000 80000000 0000c000 00000000 00000000 c0000000  .À.............€.À.............À
0x01C00E60  0000c001 00000000 00000000 e0000000 0000c002 00000000 00000000 80000000  .À.............à.À.............€
0x01C00E80  00003fff 00000000 00000000 a51c4000 00004010 00000000 00000000 00000000  ÿ?...........@.¥.@..............
0x01C00EA0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00EC0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00EE0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00F00  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00F20  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00F40  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00F60  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00F80  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00FA0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00FC0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x01C00FE0  00000000 00000000 00000000 00000000 00000000 00000000 52b396ac 01c00b78  ........................¬–.Rx.À.


========================================================================================

运行于64位Windows 7,在WOW64下运行32位进程,用零除数进行IDIV,我得到以下值:

EBP@div == x02100800  // base of heap-allocated stack frame
ESP@div == x02100FF8  // stack at "top" of allocated stack frame
ESP@entry to SEH  == 0x02100BD4 // ESP measured at first instruction of Structured Exception Handler
ContextOffset[ESP]== 0x02100D10 // Pointer to context block at entry to SEH

因此,从分割点的 ESP=0x02100FF8 到推送上下文块的底部,0x02100FF8-0x02100D10 = 0x2E8 =744字节被推送(Win32 推送716)。从推送上下文块的底部到 SEH 的条目,0x02100D10-0x02100BD4 = 0x132 ==316字节被推送(Windows32 推送252)。所以appears744+316 = 1060 字节被推送(我发现这比 Win32 推送的荒谬数量还要糟糕)。

情况变得更糟。接下来是 SEH 入口处堆栈帧的转储;请注意 0x02100BD4 以下到 0x021009D8 之间的值(至少请参阅 0x021009D8 处的“明显的 Win32 返回地址”0x77c39534)cdcdcdcd;我相信 Windows 已经践行了这些价值观,同时将控制权交给了我的 SEH。即 0x02100BD4-0x021009D8 = 0x1FC = 508 个额外字节。 (所以,可笑+难以置信)=1568到达 SEH 至少需要字节。

0x02100800  020402f0 00000001 fa0ad4b0 cdcdcdcd cdcdcdcd 0000000b cdcdcdcd cdcdcdcd  ð.......°Ô.úÍÍÍÍÍÍÍÍ....ÍÍÍÍÍÍÍÍ
0x02100820  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100840  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100860  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100880  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x021008A0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x021008C0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x021008E0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100900  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100920  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100940  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100960  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100980  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x021009A0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x021009C0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd 74fce2d9 00000000  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÙâüt....
0x021009E0  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100A00  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd 002bbfc8 00000000 02040300 00000000  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÈ¿+.............
0x02100A20  fffd708c 00000000 77791266 00000000 cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  Œpýÿ....f.yw....ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100A40  cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd cdcdcdcd  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
0x02100A60  0010001f 00001f80 002b0023 0053002b 002b002b 00010246 00000000 00000000  ....€...#.+.+.S.+.+.F...........
0x02100A80  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100AA0  00000000 00000000 00000063 00000000 00000000 00000000 00000000 00000000  ........c.......................
0x02100AC0  002bbfc8 00000000 02100ff8 00000000 02100800 00000000 02040300 00000000  È¿+.....ø.......................
0x02100AE0  fffd708c 00000000 0000002b 00000000 76f612ea 00000000 00000000 00000000  Œpýÿ....+.......ê.öv............
0x02100B00  002fe7e0 00000000 fffd5000 00000000 002ffd20 00000000 002ff170 00000000  àç/......Pýÿ.... ý/.....pñ/.....
0x02100B20  74f32450 00000000 0281b1a4 00000000 2120037b 051f0000 027b359f 00000011  P$ót....¤±......{. !....Ÿ5{.....
0x02100B40  00000000 02100cc0 00001f80 0000ffff 00000000 80000000 00004001 00000000  ....À...€...ÿÿ.........€.@......
0x02100B60  00000000 c0000000 0000c000 00000000 00000000 00000000 00000000 00000000  .......À.À......................
0x02100B80  02100bd8 00000011 00000000 02100bd8 7797b2da 7797b2f3 72982375 00000000  Ø...........Ø...Ú.—wó.—wu#˜r....
0x02100BA0  02100cc0 00456c00 0000c002 00000000 00000000 80000000 00000000 00400000  À....lE..À.............€......@.
0x02100BC0  02100b98 dfb28000 0203ff74 779971d5 071ce70d 02100bf8 7797b459 02100cc0  ˜....€.ßtÿ..Õq™w.ç..ø...Y´—wÀ...
0x02100BE0  0203ff74 02100d10 02100c94 0203ff74 7797b46d 0203ff74 02100ca8 7797b42b  tÿ......”...tÿ..m´—wtÿ..¨...+´—w
0x02100C00  02100cc0 0203ff74 02100d10 02100c94 00456c00 00000000 02100cc0 0203ff74  À...tÿ......”....lE.....À...tÿ..
0x02100C20  7797b3ce 02100cc0 0203ff74 02100d10 02100c94 00456c00 fffd708c 02100cc0  Î.—wÀ...tÿ......”....lE.ŒpýÿÀ...
0x02100C40  02040300 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100C60  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100C80  00000000 00000000 00000000 00000000 00000000 00000000 00000072 02040000  ........................r.......
0x02100CA0  0203c000 00000000 02100800 77930133 00100cc0 02100d10 02100cc0 02100d10  .À..........3.“wÀ.......À.......
0x02100CC0  c0000094 00000000 00000000 0281b1a4 00000000 00000000 00000000 00000000  ”..À........¤±..................
0x02100CE0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100D00  00000000 00000000 00000000 00000000 0001003f 00000000 00000000 00000000  ................?...............
0x02100D20  00000000 00000000 00000000 0000037b 00002120 0000ffff 027b359f 051f0023  ............{... !..ÿÿ..Ÿ5{.#...
0x02100D40  027b2ecc 0000002b 00000000 80000000 00004001 00000000 c000c000 00000000  Ì.{.+..........€.@.......À.À....
0x02100D60  80000000 0000c001 00000000 c0008000 00000000 c0000000 0000c001 00000000  ...€.À.......€.À.......À.À......
0x02100D80  c002e000 00000000 80000000 00003fff 80000000 400fdfb2 00000000 0000002b  .à.À.......€ÿ?.....€.ß.@....+...
0x02100DA0  00000053 0000002b 0000002b fffd708c 02040300 002bbfc8 00000000 00000000  S...+...+...Œpýÿ....È¿+.........
0x02100DC0  00000063 02100800 0281b1a4 00000023 00010246 02100ff8 0000002b 2120037b  c.......¤±..#...F...ø...+...{. !
0x02100DE0  051f0000 027b359f 00000023 027b2ecc 0000002b 00001f80 0000ffff 00000000  ....Ÿ5{.#...Ì.{.+...€...ÿÿ......
0x02100E00  80000000 00004001 00000000 00000000 c0000000 0000c000 00000000 00000000  ...€.@.............À.À..........
0x02100E20  80000000 0000c001 00000000 00000000 80000000 0000c000 00000000 00000000  ...€.À.............€.À..........
0x02100E40  c0000000 0000c001 00000000 00000000 e0000000 0000c002 00000000 00000000  ...À.À.............à.À..........
0x02100E60  80000000 00003fff 00000000 00000000 dfb28000 0000400f 00000000 00000000  ...€ÿ?...........€.ß.@..........
0x02100E80  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100EA0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100EC0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100EE0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100F00  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100F20  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100F40  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100F60  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100F80  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100FA0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  ................................
0x02100FC0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 fffffd34  ............................4ýÿÿ
0x02100FE0  000002e4 fffffd34 000002cc 00000019 00000000 00000063 52b396ac 02100b78  ä...4ýÿÿÌ...........c...¬–.Rx...

进入 SEH 的费用最终总结:

  • Windows32 推送 968 字节并丢弃超过该值的 184 字节;除了陷阱处的堆栈之外,您还需要 1152 字节的额外堆栈。
  • Windows64 (WOW64) 推送 1060 字节并丢弃超过该值的 508 字节;除了陷阱处的字节之外,您还需要 1568 字节。

面对Windows对堆栈空间的挥霍使用,定义“小激活记录”方案非常困难。

我猜想 Windows 下的异常处理启动起来一定非常慢;读取和写入所有这些字节需要时间。

我可能会在 Windows8 测试版上再次尝试此操作。我预计会被厌恶。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows x86-64 下,发生异常时,有多少内容被推送到 32 位堆栈上? 的相关文章

  • 为什么单线程异常会导致整个程序崩溃(如何防止这种情况?)

    例如 如果我跑步 int x 0x00000 程序崩溃了 但为什么整个程序崩溃而不是单个线程崩溃呢 我创建了多个连续睡眠的线程来测试这一点 有什么方法可以让当前线程退出 而不是整个程序 在Windows上使用winapi Thanks 但为
  • Nunit 测试给出结果 OneTimeSetUp: 未找到合适的构造函数

    我有一个问题 NUnit 告诉我 没有找到合适的构造函数 这是什么原因造成的 我还收到另一条消息 异常没有堆栈跟踪 这两条消息只是一遍又一遍地重复 这是我的代码 TestFixture public class SecurityServic
  • 简单内核无法在 GRUB 中启动

    我正在学习一些操作系统开发的知识OSDev org http osdev org 我有一个内核 我正在尝试使用 qemu 在 GRUB Legacy 0 97 中启动 但是 当我输入kernel 200 9 我收到消息 Multiboot
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • 在汇编中,指令指定数据类型吗?

    我是汇编语言编程 x86 的初学者 以下说法是否正确 在汇编中 BYTE WORD DWORD 等数据类型分别表示 8 位 16 位和 32 位模式 而不仅仅是整数 它们本身没有意义 它们只是位模式 使用它们的指令赋予了它们意义 汇编 代码
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 使用 async/await 抛出和捕获异常的正确方法

    全部请拿下面的二维码 Task
  • 未捕获 Func<> 的异常(异步)

    我有以下代码 为了进行此重现而进行了简化 显然 catch 异常块将包含更多逻辑 我有以下代码 void Main var result ExecuteAction async gt Will contain real async code
  • 收到“路径‘OPTIONS’被禁止”。 ASP.NET网站异常

    我收到错误System Web HttpException Path OPTIONS is forbidden 自从我们将网站转移到新的服务器设置以来 我无法重新创建该错误 但我每天至少会收到几次有关此异常的电子邮件 有什么想法可能导致此问
  • WCF MaxReceivedMessageSize 属性未采用

    搜索了一下 没有运气 我不断得到 已超出传入消息的最大消息大小配额 65536 要增加配额 请使用相应绑定元素上的 MaxReceivedMessageSize 属性 这是有道理的 所以我进入服务器和客户端配置并进行更改 Client
  • Java - NoSuchMethodError 未被异常捕获[重复]

    这个问题在这里已经有答案了 我的印象是 Exception 非常适合捕获所有可能的异常 因为它们中的每一个都以 Exception 作为基类 然后 在开发 Android 应用程序时 我使用了以下方法 该方法在某些自定义 ROM 中已被删除
  • 函数不会抛出 bad_alloc 异常

    我正在尝试根据 Stroustrup 的 C PL4 书做一个练习 任务是 使用分配这么多内存new that bad alloc被抛出 报告如何 分配了多少内存以及花费了多少时间 执行此操作两次 一次不写入分配的内存 一次写入每个 元素
  • 汇编PC相对寻址模式

    我正在研究数据路径 并一直在尝试理解分支指令 这就是我的理解 在 MIPS 中 每条指令都是 32 位 这是 4 个字节 所以下一条指令将是四个字节之外 举个例子 我说PC地址是128 我的第一个问题是理解这个128意味着什么 我目前的信念
  • 当跳转在 32 字节上不完全对齐时,使用 MITE(传统管道)代替 DSB(微指令缓存)

    这个问题曾经是这个 现已更新 问题 https stackoverflow com questions 59883527 unrolling 1 cycle loop reduces performance by 25 on skylake
  • 元素属性语法和属性属性语法之间有语义差异吗?

    我认为元素属性语法和属性属性语法在语义上没有太大区别 但是 我发现一定有什么不同 例如 下面的例子只是演示了一个简单的触发器
  • 如何在 x86 ASM 中将整数转换为浮点值?

    我需要将一个整数 二进制补码 乘以一个浮点常数 这是我所拥有的 data pi dd 3 14 int dd 0ah code fld pi fmul ST 1 ST 我怎样才能转换int乘以浮点值pi 你需要fild操作说明 这是一个参考
  • CIL 'fault' 子句与 C# 中的 'catch' 子句有何不同?

    根据CLI标准 http www ecma international org publications files ECMA ST ECMA 335 pdf 第 IIA 部分 第 19 章 和 MSDN 参考页System Reflect
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的

随机推荐