summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-05-22 11:20:56 +0000
committerZeev Suraski <zeev@php.net>1999-05-22 11:20:56 +0000
commit080105f79f73512f4a30820403821e416affe98e (patch)
tree04477fa3fd8e2f68ce3f96019f4955ac93564b5b
parent9b4d71205bb02bad8d661a260e800e137340f8f7 (diff)
downloadphp-git-080105f79f73512f4a30820403821e416affe98e.tar.gz
Give more information and save log lines in memory leak reports
-rw-r--r--Zend/zend.h1
-rw-r--r--Zend/zend_alloc.c29
-rw-r--r--Zend/zend_execute_API.c5
3 files changed, 29 insertions, 6 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 2a397b9a53..4318c5dd21 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -221,5 +221,6 @@ extern zend_utility_values zend_uv;
#define ZMSG_FAILED_REQUIRE_FOPEN 3L
#define ZMSG_FAILED_HIGHLIGHT_FOPEN 4L
#define ZMSG_MEMORY_LEAK_DETECTED 5L
+#define ZMSG_MEMORY_LEAK_REPEATED 6L
#endif /* _ZEND_H */
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 1848388c70..d54f00608b 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -340,6 +340,11 @@ ZEND_API void start_memory_manager(void)
ZEND_API void shutdown_memory_manager(int silent, int clean_cache)
{
mem_header *p, *t;
+#if ZEND_DEBUG
+ char *last_filename = NULL;
+ uint last_lineno = 0;
+ uint leak_count=0, total_bytes=0;
+#endif
ALS_FETCH();
p=AG(head);
@@ -348,10 +353,23 @@ ZEND_API void shutdown_memory_manager(int silent, int clean_cache)
if (!t->cached || clean_cache) {
#if ZEND_DEBUG
if (!t->cached) {
- /* does not use zend_error() *intentionally* */
- if (!silent) {
- zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t);
+ if (last_filename != t->filename || last_lineno!=t->lineno) {
+ /* flush old leak */
+ if (leak_count>0) {
+ if (!silent && leak_count>1) {
+ zend_message_dispatcher(ZMSG_MEMORY_LEAK_REPEATED, (void *) leak_count-1);
+ }
+ leak_count=0;
+ total_bytes=0;
+ }
+ last_filename = t->filename;
+ last_lineno = t->lineno;
+ if (!silent) {
+ zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t);
+ }
}
+ leak_count++;
+ total_bytes += t->size;
}
#endif
p = t->pNext;
@@ -362,6 +380,11 @@ ZEND_API void shutdown_memory_manager(int silent, int clean_cache)
t = t->pNext;
}
}
+#if ZEND_DEBUG
+ if (!silent && leak_count>1) {
+ zend_message_dispatcher(ZMSG_MEMORY_LEAK_REPEATED, (void *) leak_count-1);
+ }
+#endif
}
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 180462ed2d..526b965906 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -35,16 +35,15 @@ static void (*original_sigsegv_handler)(int);
static void zend_handle_sigsegv(int dummy)
{
fflush(stdout);
+ fflush(stderr);
signal(SIGSEGV, original_sigsegv_handler);
-/*
- printf("SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n",
+ fprintf(stderr, "SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n",
active_opline->opcode,
active_opline-EG(active_op_array)->opcodes,
get_active_function_name(),
zend_get_executed_filename(),
zend_get_executed_lineno());
original_sigsegv_handler(dummy);
-*/
}