From: Volker Lendecke Date: Fri, 30 Aug 2019 15:09:20 +0000 (+0200) Subject: lib: Add talloc_full_report_printf() X-Git-Tag: talloc-2.3.1~767 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23bee5da95026d161159da74a032780a713c820a;p=thirdparty%2Fsamba.git lib: Add talloc_full_report_printf() Print the talloc full report into a FILE*. talloc itself provides a very similar function, talloc_report_full(). However, that has a slightly different output, in particular it does not print the contents of strings, which is very handy for debugging. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/lib/util/talloc_report_printf.c b/lib/util/talloc_report_printf.c new file mode 100644 index 00000000000..cdf75b64913 --- /dev/null +++ b/lib/util/talloc_report_printf.c @@ -0,0 +1,109 @@ +/* + * talloc_report into a FILE + * + * Copyright Volker Lendecke 2015 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "replace.h" +#include "talloc_report_printf.h" + +static void talloc_report_printf_helper( + const void *ptr, + int depth, + int max_depth, + int is_ref, + void *private_data) +{ + FILE *f = private_data; + const char *name = talloc_get_name(ptr); + + if (is_ref) { + fprintf(f, + "%*sreference to: %s\n", + depth*4, + "", + name); + return; + } + + if (depth == 0) { + fprintf(f, + "%stalloc report on '%s' " + "(total %6zu bytes in %3zu blocks)\n", + (max_depth < 0 ? "full " :""), name, + talloc_total_size(ptr), + talloc_total_blocks(ptr)); + return; + } + + if (strcmp(name, "char") == 0) { + /* + * Print out the first 50 bytes of the string + */ + fprintf(f, + "%*s%-30s contains %6zu bytes in %3zu blocks " + "(ref %zu): %*s\n", depth*4, "", name, + talloc_total_size(ptr), + talloc_total_blocks(ptr), + talloc_reference_count(ptr), + (int)MIN(50, talloc_get_size(ptr)), + (const char *)ptr); + return; + } + + fprintf(f, + "%*s%-30s contains %6zu bytes in %3zu blocks (ref %zu) %p\n", + depth*4, "", name, + talloc_total_size(ptr), + talloc_total_blocks(ptr), + talloc_reference_count(ptr), + ptr); +} + +void talloc_full_report_printf(TALLOC_CTX *root, FILE *f) +{ + talloc_report_depth_cb(root, 0, -1, talloc_report_printf_helper, f); + +#ifdef HAVE_MALLINFO + { + struct mallinfo mi; + + mi = mallinfo(); + fprintf(f, + "mallinfo:\n" + " arena: %d\n" + " ordblks: %d\n" + " smblks: %d\n" + " hblks: %d\n" + " hblkhd: %d\n" + " usmblks: %d\n" + " fsmblks: %d\n" + " uordblks: %d\n" + " fordblks: %d\n" + " keepcost: %d\n", + mi.arena, + mi.ordblks, + mi.smblks, + mi.hblks, + mi.hblkhd, + mi.usmblks, + mi.fsmblks, + mi.uordblks, + mi.fordblks, + mi.keepcost); + } +#endif /* HAVE_MALLINFO */ +} diff --git a/lib/util/talloc_report_printf.h b/lib/util/talloc_report_printf.h new file mode 100644 index 00000000000..7881e655243 --- /dev/null +++ b/lib/util/talloc_report_printf.h @@ -0,0 +1,29 @@ +/* + * talloc_report into a FILE + * + * Copyright Volker Lendecke 2019 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TALLOC_REPORT_PRINTF_H_ +#define _TALLOC_REPORT_PRINTF_H_ + +#include "replace.h" +#include "system/filesys.h" +#include + +void talloc_full_report_printf(TALLOC_CTX *root, FILE *f); + +#endif diff --git a/lib/util/wscript_build b/lib/util/wscript_build index 5f005c41e49..7d446d810d1 100644 --- a/lib/util/wscript_build +++ b/lib/util/wscript_build @@ -67,6 +67,13 @@ bld.SAMBA_LIBRARY('talloc_report', private_library=True ) +bld.SAMBA_LIBRARY('talloc_report_printf', + source='talloc_report_printf.c', + local_include=False, + public_deps='talloc', + private_library=True + ) + bld.SAMBA_SUBSYSTEM('samba-util-core', source='''data_blob.c util_file.c sys_popen.c time.c signal.c util.c idtree.c fault.c