diff --git a/include/maxscale/buffer.h b/include/maxscale/buffer.h index cae47b33f..fcdd1ed6c 100644 --- a/include/maxscale/buffer.h +++ b/include/maxscale/buffer.h @@ -414,4 +414,11 @@ void *gwbuf_get_buffer_object_data(GWBUF* buf, bufobj_id_t id); extern void dprintAllBuffers(void *pdcb); #endif +/** + * Debug function for dumping buffer contents to INFO log + * + * @param buffer Buffer to dump + */ +void gwbuf_hexdump(GWBUF* buffer); + MXS_END_DECLS diff --git a/server/core/buffer.cc b/server/core/buffer.cc index 98d1ce829..cb5587623 100644 --- a/server/core/buffer.cc +++ b/server/core/buffer.cc @@ -12,14 +12,18 @@ */ #include + #include #include +#include + #include #include #include #include #include #include +#include #if defined(BUFFER_TRACE) #include @@ -879,3 +883,52 @@ size_t gwbuf_copy_data(const GWBUF *buffer, size_t offset, size_t bytes, uint8_t return bytes_read; } + +static std::string dump_one_buffer(GWBUF* buffer) +{ + std::string rval; + int len = GWBUF_LENGTH(buffer); + uint8_t* data = GWBUF_DATA(buffer); + + while (len > 0) + { + // Process the buffer in 40 byte chunks + int n = MXS_MIN(40, len); + char output[n * 2 + 1]; + gw_bin2hex(output, data, n); + char* ptr = output; + + while (ptr < output + n * 2) + { + rval.append(ptr, 2); + rval += " "; + ptr += 2; + } + len -= n; + data += n; + rval += "\n"; + } + + return rval; +} + +void gwbuf_hexdump(GWBUF* buffer) +{ + std::stringstream ss; + + ss << "Buffer " << buffer << ":\n"; + + for (GWBUF* b = buffer; b; b = b->next) + { + ss << dump_one_buffer(b); + } + + int n = ss.str().length(); + + if (n > 1024) + { + n = 1024; + } + + MXS_INFO("%.*s", n, ss.str().c_str()); +}