使用AsmJIT生成X86-64代码调用C++函数触发EXC_BAD_ACCESS崩溃求助
问题:JIT编译代码调用C++打印函数时崩溃
我正在使用asmjit将一门脚本语言JIT编译为X86-64机器码。跳转至JIT生成的函数时能正常运行,但这些函数调用我的C++函数(内部会调用printf或cout)时,程序就会崩溃,找不到原因。
LLDB里查看的信息看似正常,下面的LLDB输出是不是说明内存引用-0x180(%rbp)导致了崩溃?这看起来不该有问题,rbp和rsp的寄存器值看起来是合理的。
帧#4是JIT生成的代码,所以没有函数名。
我是这类调试的新手,需要补充其他信息请告知。
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT) frame #0: 0x00007ff8133bfebb libsystem_c.dylib`__vfprintf + 53 libsystem_c.dylib`: -> 0x7ff8133bfebb <+53>: movdqa %xmm0, -0x180(%rbp) 0x7ff8133bfec3 <+61>: movq 0x10(%rcx), %rcx 0x7ff8133bfec7 <+65>: movq %rcx, -0x170(%rbp) 0x7ff8133bfece <+72>: leaq -0x288(%rbp), %rcx Target 0: (myprog) stopped. (lldb) bt * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT) * frame #0: 0x00007ff8133bfebb libsystem_c.dylib`__vfprintf + 53 frame #1: 0x00007ff8133d1912 libsystem_c.dylib`vfprintf_l + 54 frame #2: 0x00007ff8133edfd3 libsystem_c.dylib`printf + 174 frame #3: 0x00000001000d6b8a myprog`myprog::print_i(x=123) at Core.cc:211:5 frame #4: 0x00000001007a2030 frame #5: 0x00000001000bf16b myprog`myprog::do_file_eval(mod=0x0000600001709000, stmtSeq=nullptr, showIR=false, log_asm=false) at Lang.cc:96:5 frame #6: 0x0000000100080b5c myprog`run_file(path=0x00007ff7bfefef48, show_ir=false) at cmdline_main.cc:274:13 frame #7: 0x00000001000845f9 myprog`main(argc=2, argv=0x00007ff7bfeff580) at cmdline_main.cc:403:9 frame #8: 0x00007ff8131bd41f dyld`start + 1903 (lldb) register read General Purpose Registers: rax = 0x0000000000000000 rbx = 0x00007ff7bfefe908 rcx = 0x00007ff7bfefe908 rdx = 0x0000000100200474 "In print_i " rdi = 0x00007ff856bfaa18 __sF + 152 rsi = 0x00007ff856bf9da0 __global_locale rbp = 0x00007ff7bfefe818 rsp = 0x00007ff7bfefe488 r8 = 0x0000000100200474 "In print_i " r9 = 0x00007ff7bfefe908 r10 = 0x00007ff856bfac48 __sFX + 248 r11 = 0x00007ff856bfac40 __sFX + 240 r12 = 0x00007ff856bf9da0 __global_locale r13 = 0x00007ff7bfeff4d0 r14 = 0x00007ff7bfefe908 r15 = 0x0000000100200474 "In print_i " rip = 0x00007ff8133bfebb libsystem_c.dylib`__vfprintf + 53 rflags = 0x0000000000010246 cs = 0x000000000000002b fs = 0x0000000000000000 gs = 0x0000000000000000
关联代码:print_i函数
void print_i(int64_t x) { printf("In print_i\n"); printf("%lld\n", x); }
内容的提问来源于stack exchange,提问作者Rob N
相关产品推荐
相关产品推荐

