diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-06-19 21:18:05 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-06-19 21:18:05 +0200 |
| commit | 962c3c25b657ef7ad117aa5f19040b3430480b30 (patch) | |
| tree | 25b3778e63045b40fbb14f10af0ab6bf332a81ba /src | |
| parent | ae6d6d753a1206655f7afae707d6cc759de85ec2 (diff) | |
| download | box64-962c3c25b657ef7ad117aa5f19040b3430480b30.tar.gz box64-962c3c25b657ef7ad117aa5f19040b3430480b30.zip | |
Various small debugging improvments
Diffstat (limited to 'src')
| -rwxr-xr-x | src/elfs/elfloader.c | 11 | ||||
| -rwxr-xr-x | src/emu/x64int3.c | 2 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 2 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 13 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 18 |
5 files changed, 26 insertions, 20 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index fc58a502..8b46ad3c 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -156,12 +156,10 @@ const char* ElfPath(elfheader_t* head) int AllocElfMemory(box64context_t* context, elfheader_t* head, int mainbin) { uintptr_t offs = 0; - if((mainbin && head->vaddr==0) || (!mainbin && !head->vaddr && box64_load_addr)) { - if(box64_load_addr) { - offs = box64_load_addr; - box64_load_addr += head->memsz; - box64_load_addr = (box64_load_addr+0xffffffLL)&~0xffffffLL; - } + if(!head->vaddr && box64_load_addr) { + offs = box64_load_addr; + box64_load_addr += head->memsz; + box64_load_addr = (box64_load_addr+0xffffffLL)&~0xffffffLL; } int log_level = box64_load_addr?LOG_INFO:LOG_DEBUG; if(!offs) @@ -567,7 +565,6 @@ uintptr_t tlsdescUndefweak = 0; uintptr_t GetSegmentBaseEmu(x64emu_t* emu, int seg); EXPORT uintptr_t _dl_tlsdesc_undefweak(x64emu_t* emu) { - printf_log(LOG_DEBUG, "_dl_tlsdesc_undefweak, rax=%p\n", (void*)R_RAX); struct tlsdesc *td = (struct tlsdesc *)R_RAX; return td->arg; } diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c index c382734e..07113eed 100755 --- a/src/emu/x64int3.c +++ b/src/emu/x64int3.c @@ -181,6 +181,8 @@ void x64Int3(x64emu_t* emu) } else if (!strcmp(s, "glGetStringi")) { post = 2; snprintf(buff, 255, "%04d|%p: Calling %s(0x%x, %d)", tid, *(void**)(R_RSP), s, R_EDI, R_ESI); + } else if (!strcmp(s, "_dl_tlsdesc_undefweak")) { + snprintf(buff, 255, "%04d|%p: Calling %s(RAX=%p)", tid, *(void**)(R_RSP), s, (void*)R_RAX); } else if (!strcmp(s, "glFramebufferTexture2D")) { snprintf(buff, 255, "%04d|%p: Calling %s(0x%x, 0x%x, 0x%x, %u, %d)", tid, *(void**)(R_RSP), s, R_EDI, R_ESI, R_EDX, R_ECX, R_R8d); } else if (!strcmp(s, "glTexSubImage2D")) { diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index ae306d83..16a9235e 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -961,6 +961,7 @@ const char* getAddrFunctionName(uintptr_t addr) uintptr_t start = 0; elfheader_t* elf = FindElfAddress(my_context, addr); const char* symbname = FindNearestSymbolName(elf, (void*)addr, &start, &sz); + if(!sz) sz=0x100; // arbitrary value... if(symbname && addr>=start && (addr<(start+sz) || !sz)) { if(symbname[0]=='\0') sprintf(ret, "%s + 0x%lx", ElfName(elf), addr - (uintptr_t)GetBaseAddress(elf)); @@ -982,6 +983,7 @@ void printFunctionAddr(uintptr_t nextaddr, const char* text) uint64_t sz = 0; uintptr_t start = 0; const char* symbname = FindNearestSymbolName(FindElfAddress(my_context, nextaddr), (void*)nextaddr, &start, &sz); + if(!sz) sz=0x100; // arbitrary value... if(symbname && nextaddr>=start && (nextaddr<(start+sz) || !sz)) { if(nextaddr==start) printf_log(LOG_NONE, " (%s%s:%s)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname); diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 92f973b4..7563b855 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -265,7 +265,7 @@ static void sigstack_key_alloc() { pthread_key_create(&sigstack_key, sigstack_destroy); } -uint64_t RunFunctionHandler(int* exit, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...) +uint64_t RunFunctionHandler(int* exit, int* lj, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...) { if(fnc==0 || fnc==1) { printf_log(LOG_NONE, "BOX64: Warning, calling Signal function handler %s\n", fnc?"SIG_IGN":"SIG_DFL"); @@ -319,6 +319,8 @@ uint64_t RunFunctionHandler(int* exit, x64_ucontext_t* sigcontext, uintptr_t fnc emu->quitonlongjmp = oldquitonlongjmp; if(emu->longjmp) { + if(lj) + *lj = 1; // longjmp inside signal handler, lets grab all relevent value and do the actual longjmp in the signal handler emu->longjmp = 0; if(sigcontext) { @@ -632,11 +634,12 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void R_RBP = sigcontext->uc_mcontext.gregs[X64_RBP]; int exits = 0; + int lj = box64_wine?0:1; int ret; if (simple) - ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 1, sig); + ret = RunFunctionHandler(&exits, &lj, sigcontext, my_context->signals[sig], 1, sig); else - ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 3, sig, info, sigcontext); + ret = RunFunctionHandler(&exits, &lj, sigcontext, my_context->signals[sig], 3, sig, info, sigcontext); // restore old value from emu #define GO(A) R_##A = old_##A GO(RAX); @@ -649,7 +652,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void GO(RBP); #undef GO - if(memcmp(sigcontext, &sigcontext_copy, sizeof(x64_ucontext_t))) { + if(lj && memcmp(sigcontext, &sigcontext_copy, sizeof(x64_ucontext_t))) { emu_jmpbuf_t* ejb = GetJmpBuf(); if(ejb->jmpbuf_ok) { #define GO(R) ejb->emu->regs[_##R].q[0]=sigcontext->uc_mcontext.gregs[X64_R##R] @@ -735,7 +738,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void exit(ret); } if(restorer) - RunFunctionHandler(&exits, NULL, restorer, 0); + RunFunctionHandler(&exits, NULL, NULL, restorer, 0); if(used_stack) // release stack new_ss->ss_flags = 0; relockMutex(Locks); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 675963d6..f46da308 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2611,22 +2611,23 @@ EXPORT int my_backtrace(x64emu_t* emu, void** buffer, int size) EXPORT char** my_backtrace_symbols(x64emu_t* emu, uintptr_t* buffer, int size) { (void)emu; - char** ret = (char**)calloc(1, size*sizeof(char*) + size*100); // capping each strings to 100 chars + char** ret = (char**)calloc(1, size*sizeof(char*) + size*200); // capping each strings to 200 chars char* s = (char*)(ret+size); for (int i=0; i<size; ++i) { uintptr_t start = 0; uint64_t sz = 0; elfheader_t *hdr = FindElfAddress(my_context, buffer[i]); const char* symbname = FindNearestSymbolName(hdr, (void*)buffer[i], &start, &sz); + if(!sz) sz=0x100; // arbitrary value... if (symbname && buffer[i]>=start && (buffer[i]<(start+sz) || !sz)) { - snprintf(s, 100, "%s(%s+%lx) [%p]", ElfName(hdr), symbname, buffer[i] - start, (void*)buffer[i]); + snprintf(s, 200, "%s(%s+%lx) [%p]", ElfName(hdr), symbname, buffer[i] - start, (void*)buffer[i]); } else if (hdr) { - snprintf(s, 100, "%s+%lx [%p]", ElfName(hdr), buffer[i] - (uintptr_t)GetBaseAddress(hdr), (void*)buffer[i]); + snprintf(s, 200, "%s+%lx [%p]", ElfName(hdr), buffer[i] - (uintptr_t)GetBaseAddress(hdr), (void*)buffer[i]); } else { - snprintf(s, 100, "??? [%p]", (void*)buffer[i]); + snprintf(s, 200, "??? [%p]", (void*)buffer[i]); } ret[i] = s; - s += 100; + s += 200; } return ret; } @@ -2634,15 +2635,16 @@ EXPORT char** my_backtrace_symbols(x64emu_t* emu, uintptr_t* buffer, int size) EXPORT void my_backtrace_symbols_fd(x64emu_t* emu, uintptr_t* buffer, int size, int fd) { (void)emu; - char s[100]; + char s[200]; for (int i=0; i<size; ++i) { uintptr_t start = 0; uint64_t sz = 0; const char* symbname = FindNearestSymbolName(FindElfAddress(my_context, buffer[i]), (void*)buffer[i], &start, &sz); + if(!sz) sz=0x100; // arbitrary value... if(symbname && buffer[i]>=start && (buffer[i]<(start+sz) || !sz)) - snprintf(s, 100, "%s+%ld [%p]\n", symbname, buffer[i] - start, (void*)buffer[i]); + snprintf(s, 200, "%s+%ld [%p]\n", symbname, buffer[i] - start, (void*)buffer[i]); else - snprintf(s, 100, "??? [%p]\n", (void*)buffer[i]); + snprintf(s, 200, "??? [%p]\n", (void*)buffer[i]); int dummy = write(fd, s, strlen(s)); (void)dummy; } |