29#if defined(INFIX_DEBUG_ENABLED) && INFIX_DEBUG_ENABLED
32#if defined(DBLTAP_ENABLE) && defined(DBLTAP_IMPLEMENTATION)
40 printf("# " __VA_ARGS__); \
62void infix_dump_hex(
const void * data,
size_t size,
const char * title) {
63 const uint8_t *
byte = (
const uint8_t *)data;
68 note(
"%s (size: %llu bytes at %p)", title, (
unsigned long long)size, data);
69 for (
size_t i = 0; i < size; i += 16) {
71 remaining_len =
sizeof(line_buf);
73 written = snprintf(buf_ptr, remaining_len,
"0x%04llx: ", (
unsigned long long)i);
74 if (written < 0 || (
size_t)written >= remaining_len)
77 remaining_len -= written;
79 for (
size_t j = 0; j < 16; ++j) {
81 written = snprintf(buf_ptr, remaining_len,
"%02x ",
byte[i + j]);
83 written = snprintf(buf_ptr, remaining_len,
" ");
84 if (written < 0 || (
size_t)written >= remaining_len)
87 remaining_len -= written;
89 written = snprintf(buf_ptr, remaining_len,
" ");
90 if (written < 0 || (
size_t)written >= remaining_len)
93 remaining_len -= written;
96 written = snprintf(buf_ptr, remaining_len,
"| ");
97 if (written < 0 || (
size_t)written >= remaining_len)
100 remaining_len -= written;
102 for (
size_t j = 0; j < 16; ++j) {
104 if (
byte[i + j] >= 32 &&
byte[i + j] <= 126)
105 written = snprintf(buf_ptr, remaining_len,
"%c",
byte[i + j]);
107 written = snprintf(buf_ptr, remaining_len,
".");
108 if (written < 0 || (
size_t)written >= remaining_len)
111 remaining_len -= written;
115 note(
" %s", line_buf);
117 note(
"End of %s", title);
130#if defined(__x86_64__) || defined(_M_X64)
131 printf(
"# Dumping x64 Register State at %s:%d\n", file, line);
132 volatile unsigned long long stack_dump[16];
133 register long long rsp __asm__(
"rsp");
135 __asm__ __volatile__(
136 "movq %%rax, %%r15\n\t"
137 "movq %%rbx, %%r14\n\t"
138 "movq %%rcx, %%r13\n\t"
139 "movq %%rdx, %%r12\n\t"
140 "movq %%rsi, %%r11\n\t"
141 "movq %%rdi, %%r10\n\t"
142 "movq %%rbp, %%r9\n\t"
145 :
"r8",
"r9",
"r10",
"r11",
"r12",
"r13",
"r14",
"r15");
146 register long long rax __asm__(
"r15");
147 register long long rbx __asm__(
"r14");
148 register long long rcx __asm__(
"r13");
149 register long long rdx __asm__(
"r12");
150 register long long rsi __asm__(
"r11");
151 register long long rdi __asm__(
"r10");
152 register long long rbp __asm__(
"r9");
154 for (
int i = 0; i < 16; ++i)
155 stack_dump[i] = ((
unsigned long long *)rsp)[i];
157 printf(
"# RAX: %016llx RBX: %016llx\n", rax, rbx);
158 printf(
"# RCX: %016llx RDX: %016llx\n", rcx, rdx);
159 printf(
"# RSI: %016llx RDI: %016llx\n", rsi, rdi);
160 printf(
"# RBP: %016llx RSP: %016llx\n", rbp, rsp);
163 printf(
"# Stack Dump (128 bytes) ---\n");
164 for (
int i = 0; i < 16; i += 2)
165 printf(
"%016llx: %016llx %016llx\n", rsp + i * 8, stack_dump[i], stack_dump[i + 1]);
166#elif defined(__aarch64__) || defined(_M_ARM64)
167 printf(
"# Dumping AArch64 Register State at %s:%d\n", file, line);
168 volatile unsigned long long stack_dump[16];
169 register long long sp __asm__(
"sp");
171 long long x0, x1, x2, x3, x4, x5, x6, x7;
172 __asm__ __volatile__(
181 :
"=r"(x0),
"=r"(x1),
"=r"(x2),
"=r"(x3),
"=r"(x4),
"=r"(x5),
"=r"(x6),
"=r"(x7));
182 printf(
"# x0: %016llx x1: %016llx\n", x0, x1);
183 printf(
"# x2: %016llx x3: %016llx\n", x2, x3);
184 printf(
"# x4: %016llx x5: %016llx\n", x4, x5);
185 printf(
"# x6: %016llx x7: %016llx\n", x6, x7);
187 printf(
"# SP: %016llx\n", sp);
189 for (
int i = 0; i < 16; ++i)
190 stack_dump[i] = ((
unsigned long long *)sp)[i];
192 printf(
"# Stack Dump (128 bytes)\n");
195 for (
int i = 0; i < 16; i += 2)
196 printf(
"# %016llx: %016llx %016llx\n", sp + i * 8, stack_dump[i], stack_dump[i + 1]);
198 printf(
"# infix_dump_state() not implemented for this architecture\n");
A lightweight, single-header TAP (Test Anything Protocol) library.
#define note(...)
Definition double_tap.h:210
A header for conditionally compiled debugging utilities.
static void infix_dump_state(c23_maybe_unused const char *file, c23_maybe_unused int line)
Definition utility.h:149
static void infix_dump_hex(c23_maybe_unused const void *data, c23_maybe_unused size_t size, c23_maybe_unused const char *title)
Definition utility.h:131