mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-11 05:54:39 +00:00
MINOR: tools: add a generic hexdump function for debugging
debug_hexdump() prints to the requested output stream (typically stdout or stderr) an hex dump of the blob passed in argument. This is useful to help debug binary protocols.
This commit is contained in:
parent
990397ed2e
commit
0ebb511b3e
@ -24,6 +24,7 @@
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
@ -990,6 +991,11 @@ char *env_expand(char *in);
|
||||
*/
|
||||
#define fddebug(msg...) do { char *_m = NULL; memprintf(&_m, ##msg); if (_m) write(-1, _m, strlen(_m)); free(_m); } while (0)
|
||||
|
||||
/* displays a <len> long memory block at <buf>, assuming first byte of <buf>
|
||||
* has address <baseaddr>. The output is emitted to file <out>.
|
||||
*/
|
||||
void debug_hexdump(FILE *out, char *buf, unsigned int baseaddr, int len);
|
||||
|
||||
/* used from everywhere just to drain results we don't want to read and which
|
||||
* recent versions of gcc increasingly and annoyingly complain about.
|
||||
*/
|
||||
|
@ -3765,6 +3765,51 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len,
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/* displays a <len> long memory block at <buf>, assuming first byte of <buf>
|
||||
* has address <baseaddr>. The output is emitted to file <out>.
|
||||
*/
|
||||
void debug_hexdump(FILE *out, char *buf, unsigned int baseaddr, int len)
|
||||
{
|
||||
unsigned int i, j;
|
||||
int b;
|
||||
|
||||
for (i = 0; i < (len + (baseaddr & 15)); i += 16) {
|
||||
b = i - (baseaddr & 15);
|
||||
fprintf(out, "%08x: ", i + (baseaddr & ~15));
|
||||
for (j = 0; j < 8; j++) {
|
||||
if (b + j >= 0 && b + j < len)
|
||||
fprintf(out, "%02x ", (unsigned char)buf[b + j]);
|
||||
else
|
||||
fprintf(out, " ");
|
||||
}
|
||||
|
||||
if (b + j >= 0 && b + j < len)
|
||||
fputc('-', out);
|
||||
else
|
||||
fputc(' ', out);
|
||||
|
||||
for (j = 8; j < 16; j++) {
|
||||
if (b + j >= 0 && b + j < len)
|
||||
fprintf(out, " %02x", (unsigned char)buf[b + j]);
|
||||
else
|
||||
fprintf(out, " ");
|
||||
}
|
||||
|
||||
fprintf(out, " ");
|
||||
for (j = 0; j < 16; j++) {
|
||||
if (b + j >= 0 && b + j < len) {
|
||||
if (isprint((unsigned char)buf[b + j]))
|
||||
fputc((unsigned char)buf[b + j], out);
|
||||
else
|
||||
fputc('.', out);
|
||||
}
|
||||
else
|
||||
fputc(' ', out);
|
||||
}
|
||||
fputc('\n', out);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* c-indent-level: 8
|
||||
|
Loading…
Reference in New Issue
Block a user