gpt4 book ai didi

c - 未处理的异常 0xC0000008 : An invalid handle was specified in dynamic recompiler

转载 作者:行者123 更新时间:2023-11-30 17:02:13 25 4
gpt4 key购买 nike

该代码是 MIPS->ARM 动态重新编译器。多次运行 recompile_function() 后,在下面代码的条件子句处崩溃,尽管在之前的函数运行期间可以毫无问题地运行这行代码。

void recompile_function(){

//recompilation code
......

if (out > (u_char *)((u_char *)base_addr + (1 << TARGET_SIZE_2) - MAX_OUTPUT_BLOCK_SIZE - JUMP_TABLE_SIZE))
out = (u_char *)base_addr;

// other code
......
}

变量out是用于编写重新编译的代码的指针。 base_addr 始终指向分配的内存空间的原始起始位置。每次写入指令时,变量 out 前进 4 个字节,而 base_addr 保持不变。

extern char extra_memory[33554432];
#define BASE_ADDR ((int)(&extra_memory))
void *base_addr;
u_char *out;

void new_dynarec_init()
{
protect_readwrite();
base_addr = ((int)(&extra_memory));
out = (u_char *)base_addr;
}

错误是“frontend.exe 中 0x7738EC9F (ntdll.dll) 处出现未处理的异常:0xC0000008:指定了无效句柄。”

这是围绕错误子句指令的反汇编代码。

#if NEW_DYNAREC == NEW_DYNAREC_ARM
__clear_cache((void *)beginning, out);
53830242 ldr r1,[r9]
53830246 add r3,r4,r5,lsl #2
5383024A mov r0,r7
5383024C str r3,[r2]
5383024E blx __clear_cache_bugfix (537D19DCh)
//cacheflush((void *)beginning,out,0);
#endif

// If we're within 256K of the end of the buffer,
// start over from the beginning. (Is 256K enough?)
if (out > (u_char *)((u_char *)base_addr + (1 << TARGET_SIZE_2) - MAX_OUTPUT_BLOCK_SIZE - JUMP_TABLE_SIZE))
53830252 mov r2,#0xAA98
53830256 movt r2,#0x5462
5383025A ldr r3,new_recompile_block+0A1E8h (53830550h)
5383025C ldr r4,[r2]
5383025E ldr r2,[r9]
53830262 add r3,r3,r4
53830264 cmp r2,r3
53830266 bls new_recompile_block+9F06h (5383026Eh)
out = (u_char *)base_addr;
53830268 mov r2,r4
5383026A str r4,[r9]

这是调试器提示我的行。我检查了也指向这一行的反汇编窗口。更重要的是,如果我选择继续,则会弹出一个新错误,并且程序将在函数 __report_gsfailure 中的代码行“__fastfail”处崩溃。新错误是“frontend.exe 中 0x53831547 (mupen64plus.dll) 处未处理的异常:堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出”。 0x53831546是代码行“__fastfail”的地址。

#pragma warning(push)
#pragma warning(disable: 4100) // unreferenced formal parameter
__declspec(noreturn) void __cdecl __report_gsfailure(GSFAILURE_PARAMETER)
{
5383153C push {r0,r1}
5383153E push {r11,lr}
53831542 mov r11,sp
__fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE);
53831544 movs r0,#2
53831546 __fastfail
}

// Declare stub for rangecheckfailure, since these occur often enough that the
// code bloat of setting up the parameters hurts performance
__declspec(noreturn) void __cdecl __report_rangecheckfailure()
{
53831548 push {r11,lr}
5383154C mov r11,sp
__report_securityfailure(FAST_FAIL_RANGE_CHECK_FAILURE);
5383154E movs r0,#8
53831550 bl __report_securityfailure (53831558h)
53831554 __debugbreak

寄存器 PC = 53831546,因此执行点为 __fastfail。

最佳答案

该错误是由位于崩溃条件子句上方的 __clear_cache 引起的。禁用该函数调用修复了崩溃。

关于c - 未处理的异常 0xC0000008 : An invalid handle was specified in dynamic recompiler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36662311/

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