1 #include "sys/unwind.h"
3 #include "lib/string.h"
7 __attribute__((section(
".debug_symbols"))) char function_addr_data[128 * 1024] = {0};
9 char _temp_funcname[1024] = {0};
11 size_t decode_hex(
const char s[],
int length) {
15 for (
int i = length - 1; i >= 0; i--) {
18 if(s[i] >= 0 && s[i] <=
'9') {
20 }
else if(s[i] >=
'a' && s[i] <=
'f') {
21 digit = s[i] -
'a' + 10;
32 bool get_func_name_by_addr(
size_t addr) {
33 char* temp = (
char*)function_addr_data;
35 memset(_temp_funcname, 0, 1024);
38 memset(_temp_funcname, 0, 1024);
40 size_t current_addr = decode_hex(temp, 8);
49 size_t next_addr = decode_hex(temp, 8);
53 if(addr >= current_addr && addr < next_addr) {
56 }
while(*temp !=
'\0');
61 void unwind_stack(uint32_t MaxFrames) {
63 __asm__
volatile(
"movl %%ebp, %0" :
"=r"(stk) :: );
65 qemu_log(
"Stack trace:");
67 for(uint32_t frame = 0; stk && frame < MaxFrames; ++frame) {
68 qemu_printf(
" Frame #%d => %x -> ", frame, stk->eip);
70 bool exists = get_func_name_by_addr(stk->eip);
72 qemu_printf(
"%s\n", exists ? _temp_funcname :
"???");
struct registers __attribute__((packed))
Структура данных пакета от мыши
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
size_t struntil(const char *str, const char find)
Возвращает индекс символа в строке
void qemu_printf(const char *text,...)
Вывод QEMU через COM1 информации