From efc6ecab8255beedbe2f2148bb4d1dfeadf335b8 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Mon, 24 Oct 2011 15:46:48 +0000 Subject: [PATCH] malloc() debugging on MacOSX. --- src/core/nginx.c | 2 -- src/core/ngx_slab.c | 4 ++-- src/os/unix/ngx_darwin.h | 3 +++ src/os/unix/ngx_darwin_config.h | 1 + src/os/unix/ngx_darwin_init.c | 30 ++++++++++++++++++++++++++++++ src/os/unix/ngx_freebsd.h | 3 ++- src/os/unix/ngx_freebsd_config.h | 1 + src/os/unix/ngx_freebsd_init.c | 7 ++++--- src/os/unix/ngx_linux_config.h | 1 + src/os/unix/ngx_os.h | 1 - src/os/unix/ngx_posix_config.h | 2 ++ src/os/unix/ngx_solaris_config.h | 1 + src/os/win32/ngx_win32_config.h | 1 + 13 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/core/nginx.c b/src/core/nginx.c index 3a413e84e..da32c1a50 100644 --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -203,9 +203,7 @@ main(int argc, char *const *argv) ngx_cycle_t *cycle, init_cycle; ngx_core_conf_t *ccf; -#if (NGX_FREEBSD) ngx_debug_init(); -#endif if (ngx_strerror_init() != NGX_OK) { return 1; diff --git a/src/core/ngx_slab.c b/src/core/ngx_slab.c index 870c59bad..9b5b28f2f 100644 --- a/src/core/ngx_slab.c +++ b/src/core/ngx_slab.c @@ -46,10 +46,10 @@ #else -#if (NGX_FREEBSD) +#if (NGX_HAVE_DEBUG_MALLOC) #define ngx_slab_junk(p, size) \ - if (ngx_freebsd_debug_malloc) ngx_memset(p, 0xD0, size) + if (ngx_debug_malloc) ngx_memset(p, 0xD0, size) #else diff --git a/src/os/unix/ngx_darwin.h b/src/os/unix/ngx_darwin.h index 7fa60ff0c..ebd8d355d 100644 --- a/src/os/unix/ngx_darwin.h +++ b/src/os/unix/ngx_darwin.h @@ -8,6 +8,7 @@ #define _NGX_DARWIN_H_INCLUDED_ +void ngx_debug_init(void); ngx_chain_t *ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit); @@ -15,5 +16,7 @@ extern int ngx_darwin_kern_osreldate; extern int ngx_darwin_hw_ncpu; extern u_long ngx_darwin_net_inet_tcp_sendspace; +extern ngx_uint_t ngx_debug_malloc; + #endif /* _NGX_DARWIN_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_darwin_config.h b/src/os/unix/ngx_darwin_config.h index a3a14c493..1717c690f 100644 --- a/src/os/unix/ngx_darwin_config.h +++ b/src/os/unix/ngx_darwin_config.h @@ -87,6 +87,7 @@ #define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define NGX_HAVE_DEBUG_MALLOC 1 extern char **environ; diff --git a/src/os/unix/ngx_darwin_init.c b/src/os/unix/ngx_darwin_init.c index 67133198b..c3d1125fc 100644 --- a/src/os/unix/ngx_darwin_init.c +++ b/src/os/unix/ngx_darwin_init.c @@ -14,6 +14,8 @@ int ngx_darwin_hw_ncpu; int ngx_darwin_kern_ipc_somaxconn; u_long ngx_darwin_net_inet_tcp_sendspace; +ngx_uint_t ngx_debug_malloc; + static ngx_os_io_t ngx_darwin_io = { ngx_unix_recv, @@ -55,6 +57,34 @@ sysctl_t sysctls[] = { }; +void +ngx_debug_init() +{ +#if (NGX_DEBUG_MALLOC) + + /* + * MacOSX 10.6, 10.7: MallocScribble fills freed memory with 0x55 + * and fills allocated memory with 0xAA. + * MacOSX 10.4, 10.5: MallocScribble fills freed memory with 0x55, + * MallocPreScribble fills allocated memory with 0xAA. + * MacOSX 10.3: MallocScribble fills freed memory with 0x55, + * and no way to fill allocated memory. + */ + + setenv("MallocScribble", "1", 0); + + ngx_debug_malloc = 1; + +#else + + if (getenv("MallocScribble")) { + ngx_debug_malloc = 1; + } + +#endif +} + + ngx_int_t ngx_os_specific_init(ngx_log_t *log) { diff --git a/src/os/unix/ngx_freebsd.h b/src/os/unix/ngx_freebsd.h index 67fce3eb7..a96f4eb1a 100644 --- a/src/os/unix/ngx_freebsd.h +++ b/src/os/unix/ngx_freebsd.h @@ -8,6 +8,7 @@ #define _NGX_FREEBSD_H_INCLUDED_ +void ngx_debug_init(void); ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit); @@ -17,7 +18,7 @@ extern u_long ngx_freebsd_net_inet_tcp_sendspace; extern ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; extern ngx_uint_t ngx_freebsd_use_tcp_nopush; -extern ngx_uint_t ngx_freebsd_debug_malloc; +extern ngx_uint_t ngx_debug_malloc; #endif /* _NGX_FREEBSD_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h index 3169c277a..798f2eacd 100644 --- a/src/os/unix/ngx_freebsd_config.h +++ b/src/os/unix/ngx_freebsd_config.h @@ -109,6 +109,7 @@ pid_t rfork_thread(int flags, void *stack, int (*func)(void *arg), void *arg); #define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define NGX_HAVE_DEBUG_MALLOC 1 extern char **environ; diff --git a/src/os/unix/ngx_freebsd_init.c b/src/os/unix/ngx_freebsd_init.c index 1211c7ccb..bfb89087a 100644 --- a/src/os/unix/ngx_freebsd_init.c +++ b/src/os/unix/ngx_freebsd_init.c @@ -22,7 +22,8 @@ int ngx_freebsd_machdep_hlt_logical_cpus; ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; ngx_uint_t ngx_freebsd_use_tcp_nopush; -ngx_uint_t ngx_freebsd_debug_malloc; + +ngx_uint_t ngx_debug_malloc; static ngx_os_io_t ngx_freebsd_io = { @@ -80,7 +81,7 @@ ngx_debug_init() malloc_options = "J"; #endif - ngx_freebsd_debug_malloc = 1; + ngx_debug_malloc = 1; #else char *mo; @@ -88,7 +89,7 @@ ngx_debug_init() mo = getenv("MALLOC_OPTIONS"); if (mo && ngx_strchr(mo, 'J')) { - ngx_freebsd_debug_malloc = 1; + ngx_debug_malloc = 1; } #endif } diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index a2ef51237..d72cf26b6 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -108,6 +108,7 @@ typedef struct iocb ngx_aiocb_t; #define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define ngx_debug_init() extern char **environ; diff --git a/src/os/unix/ngx_os.h b/src/os/unix/ngx_os.h index f1d8e6824..8f9622ed3 100644 --- a/src/os/unix/ngx_os.h +++ b/src/os/unix/ngx_os.h @@ -31,7 +31,6 @@ typedef struct { } ngx_os_io_t; -void ngx_debug_init(void); ngx_int_t ngx_os_init(ngx_log_t *log); void ngx_os_status(ngx_log_t *log); ngx_int_t ngx_os_specific_init(ngx_log_t *log); diff --git a/src/os/unix/ngx_posix_config.h b/src/os/unix/ngx_posix_config.h index aec8a0a35..e327d5460 100644 --- a/src/os/unix/ngx_posix_config.h +++ b/src/os/unix/ngx_posix_config.h @@ -125,6 +125,8 @@ typedef struct aiocb ngx_aiocb_t; #define NGX_LISTEN_BACKLOG 511 +#define ngx_debug_init() + #if (__FreeBSD__) && (__FreeBSD_version < 400017) diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h index 6b3d42eaa..fe66026e5 100644 --- a/src/os/unix/ngx_solaris_config.h +++ b/src/os/unix/ngx_solaris_config.h @@ -98,6 +98,7 @@ #define NGX_HAVE_OS_SPECIFIC_INIT 1 +#define ngx_debug_init() extern char **environ; diff --git a/src/os/win32/ngx_win32_config.h b/src/os/win32/ngx_win32_config.h index 8ffe95c31..6d8864139 100644 --- a/src/os/win32/ngx_win32_config.h +++ b/src/os/win32/ngx_win32_config.h @@ -182,6 +182,7 @@ typedef int sig_atomic_t; #define ngx_random rand +#define ngx_debug_init() #endif /* _NGX_WIN32_CONFIG_H_INCLUDED_ */