malloc: Add file output for heap dump and malloc log

Add malloc_dump_to_file() and malloc_log_to_file() functions to write
heap dumps and malloc traffic logs to host files. This is useful for
debugging memory leaks in sandbox by allowing comparison of before/after
heap states with external tools like diff.

These functions are only available in sandbox builds since they use
host-filesystem access.

Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
This commit is contained in:
Simon Glass
2026-01-01 17:04:07 -07:00
parent 1d306039ce
commit 25b5423a02
2 changed files with 90 additions and 0 deletions

View File

@@ -6144,6 +6144,38 @@ void malloc_log_dump(void)
malloc_log_impl(log_to_console, NULL);
}
#if IS_ENABLED(CONFIG_SANDBOX)
/* File output function for log */
static void log_to_file(void *ctx, const char *fmt, ...)
{
int fd = *(int *)ctx;
char buf[256];
va_list args;
int len;
va_start(args, fmt);
len = vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
if (len > 0)
os_write(fd, buf, len);
}
int malloc_log_to_file(const char *fname)
{
int fd;
fd = os_open(fname, OS_O_WRONLY | OS_O_CREAT | OS_O_TRUNC);
if (fd < 0)
return fd;
malloc_log_impl(log_to_file, &fd);
os_close(fd);
return 0;
}
#endif
int malloc_log_info(struct mlog_info *info)
{
if (!mlog.buf)
@@ -7481,6 +7513,26 @@ static void dump_to_console(void *ctx, const char *fmt, ...)
va_end(args);
}
#if IS_ENABLED(CONFIG_SANDBOX)
#include <os.h>
/* File output function for heap dump */
static void dump_to_file(void *ctx, const char *fmt, ...)
{
int fd = *(int *)ctx;
char buf[256];
va_list args;
int len;
va_start(args, fmt);
len = vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
if (len > 0)
os_write(fd, buf, len);
}
#endif
static void malloc_dump_impl(dump_out_fn out, void *ctx)
{
mchunkptr q;
@@ -7568,6 +7620,22 @@ void malloc_dump(void)
malloc_dump_impl(dump_to_console, NULL);
}
#if IS_ENABLED(CONFIG_SANDBOX)
int malloc_dump_to_file(const char *fname)
{
int fd;
fd = os_open(fname, OS_O_WRONLY | OS_O_CREAT | OS_O_TRUNC);
if (fd < 0)
return fd;
malloc_dump_impl(dump_to_file, &fd);
os_close(fd);
return 0;
}
#endif
int initf_malloc(void)
{
#if CONFIG_IS_ENABLED(SYS_MALLOC_F)

View File

@@ -712,6 +712,17 @@ void malloc_disable_testing(void);
*/
void malloc_dump(void);
/**
* malloc_dump_to_file() - Write heap dump to a host file
*
* @fname: Path to the output file on the host filesystem
* Return: 0 on success, negative error code on failure
*
* This is only available in sandbox builds. It writes the same information
* as malloc_dump() but to a file instead of the console.
*/
int malloc_dump_to_file(const char *fname);
/**
* malloc_log_start() - Start logging malloc traffic
*
@@ -733,6 +744,17 @@ void malloc_log_stop(void);
*/
void malloc_log_dump(void);
/**
* malloc_log_to_file() - Write malloc()-traffic log to a host file
*
* @fname: Path to the output file on the host filesystem
* Return: 0 on success, negative error code on failure
*
* This is only available in sandbox builds. It writes the same information
* as malloc_log_dump() but to a file instead of the console.
*/
int malloc_log_to_file(const char *fname);
/**
* enum mlog_type - Type of malloc log entry
*/