Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
84aab094
Commit
84aab094
authored
Mar 22, 2016
by
Victor Stinner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #26588: add debug traces
Try to debug random failure on buildbots.
parent
24f949e1
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
59 additions
and
5 deletions
+59
-5
Lib/test/test_tracemalloc.py
Lib/test/test_tracemalloc.py
+10
-0
Modules/_testcapimodule.c
Modules/_testcapimodule.c
+14
-0
Modules/_tracemalloc.c
Modules/_tracemalloc.c
+35
-5
No files found.
Lib/test/test_tracemalloc.py
View file @
84aab094
...
...
@@ -88,6 +88,9 @@ def traceback_filename(filename):
class
TestTracemallocEnabled
(
unittest
.
TestCase
):
def
setUp
(
self
):
if
_testcapi
:
_testcapi
.
tracemalloc_set_debug
(
True
)
if
tracemalloc
.
is_tracing
():
self
.
skipTest
(
"tracemalloc must be stopped before the test"
)
...
...
@@ -95,6 +98,8 @@ class TestTracemallocEnabled(unittest.TestCase):
def
tearDown
(
self
):
tracemalloc
.
stop
()
if
_testcapi
:
_testcapi
.
tracemalloc_set_debug
(
False
)
def
test_get_tracemalloc_memory
(
self
):
data
=
[
allocate_bytes
(
123
)
for
count
in
range
(
1000
)]
...
...
@@ -877,6 +882,9 @@ class TestCAPI(unittest.TestCase):
maxDiff = 80 * 20
def setUp(self):
if _testcapi:
_testcapi.tracemalloc_set_debug(True)
if tracemalloc.is_tracing():
self.skipTest("tracemalloc must be stopped before the test")
...
...
@@ -890,6 +898,8 @@ class TestCAPI(unittest.TestCase):
def tearDown(self):
tracemalloc.stop()
if _testcapi:
_testcapi.tracemalloc_set_debug(False)
def get_traceback(self):
frames = _testcapi.tracemalloc_get_traceback(self.domain, self.ptr)
...
...
Modules/_testcapimodule.c
View file @
84aab094
...
...
@@ -3747,6 +3747,19 @@ tracemalloc_get_traceback(PyObject *self, PyObject *args)
return
_PyTraceMalloc_GetTraceback
(
domain
,
(
Py_uintptr_t
)
ptr
);
}
PyObject
*
tracemalloc_set_debug
(
PyObject
*
self
,
PyObject
*
args
)
{
int
debug
;
extern
int
tracemalloc_debug
;
if
(
!
PyArg_ParseTuple
(
args
,
"i"
,
&
debug
))
return
NULL
;
tracemalloc_debug
=
debug
;
Py_RETURN_NONE
;
}
static
PyMethodDef
TestMethods
[]
=
{
{
"raise_exception"
,
raise_exception
,
METH_VARARGS
},
...
...
@@ -3936,6 +3949,7 @@ static PyMethodDef TestMethods[] = {
{
"tracemalloc_track"
,
tracemalloc_track
,
METH_VARARGS
},
{
"tracemalloc_untrack"
,
tracemalloc_untrack
,
METH_VARARGS
},
{
"tracemalloc_get_traceback"
,
tracemalloc_get_traceback
,
METH_VARARGS
},
{
"tracemalloc_set_debug"
,
tracemalloc_set_debug
,
METH_VARARGS
},
{
NULL
,
NULL
}
/* sentinel */
};
...
...
Modules/_tracemalloc.c
View file @
84aab094
...
...
@@ -45,6 +45,8 @@ static struct {
int
use_domain
;
}
tracemalloc_config
=
{
TRACEMALLOC_NOT_INITIALIZED
,
0
,
1
,
1
};
int
tracemalloc_debug
=
0
;
#if defined(TRACE_RAW_MALLOC) && defined(WITH_THREAD)
/* This lock is needed because tracemalloc_free() is called without
the GIL held from PyMem_RawFree(). It cannot acquire the lock because it
...
...
@@ -891,18 +893,24 @@ tracemalloc_clear_traces(void)
_Py_hashtable_clear
(
tracemalloc_filenames
);
}
#define DEBUG(MSG) \
if (tracemalloc_debug) { fprintf(stderr, "[pid %li, tid %li] " MSG "\n", (long)getpid(), PyThread_get_thread_ident()); fflush(stderr); }
static
int
tracemalloc_init
(
void
)
{
DEBUG
(
"tracemalloc_init()"
);
if
(
tracemalloc_config
.
initialized
==
TRACEMALLOC_FINALIZED
)
{
PyErr_SetString
(
PyExc_RuntimeError
,
"the tracemalloc module has been unloaded"
);
return
-
1
;
}
if
(
tracemalloc_config
.
initialized
==
TRACEMALLOC_INITIALIZED
)
if
(
tracemalloc_config
.
initialized
==
TRACEMALLOC_INITIALIZED
)
{
DEBUG
(
"tracemalloc_init(): exit (already initialized)"
);
return
0
;
}
PyMem_GetAllocator
(
PYMEM_DOMAIN_RAW
,
&
allocators
.
raw
);
...
...
@@ -969,9 +977,11 @@ tracemalloc_init(void)
/* Disable tracing allocations until hooks are installed. Set
also the reentrant flag to detect bugs: fail with an assertion error
if set_reentrant(1) is called while tracing is disabled. */
DEBUG
(
"tracemalloc_init(): set_reentrant(1)"
);
set_reentrant
(
1
);
tracemalloc_config
.
initialized
=
TRACEMALLOC_INITIALIZED
;
DEBUG
(
"tracemalloc_init(): done"
);
return
0
;
}
...
...
@@ -979,8 +989,11 @@ tracemalloc_init(void)
static
void
tracemalloc_deinit
(
void
)
{
if
(
tracemalloc_config
.
initialized
!=
TRACEMALLOC_INITIALIZED
)
DEBUG
(
"tracemalloc_deinit()"
);
if
(
tracemalloc_config
.
initialized
!=
TRACEMALLOC_INITIALIZED
)
{
DEBUG
(
"tracemalloc_deinit(): exit (not initialized)"
);
return
;
}
tracemalloc_config
.
initialized
=
TRACEMALLOC_FINALIZED
;
tracemalloc_stop
();
...
...
@@ -997,11 +1010,13 @@ tracemalloc_deinit(void)
}
#endif
DEBUG
(
"tracemalloc_deinit(): delete reentrant key"
);
#ifdef REENTRANT_THREADLOCAL
PyThread_delete_key
(
tracemalloc_reentrant_key
);
#endif
Py_XDECREF
(
unknown_filename
);
DEBUG
(
"tracemalloc_deinit(): done"
);
}
...
...
@@ -1011,11 +1026,15 @@ tracemalloc_start(int max_nframe)
PyMemAllocatorEx
alloc
;
size_t
size
;
if
(
tracemalloc_init
()
<
0
)
DEBUG
(
"tracemalloc_start()"
);
if
(
tracemalloc_init
()
<
0
)
{
DEBUG
(
"tracemalloc_start(): ERROR! init failed!"
);
return
-
1
;
}
if
(
tracemalloc_config
.
tracing
)
{
/* hook already installed: do nothing */
DEBUG
(
"tracemalloc_start(): exit (already tracing)"
);
return
0
;
}
...
...
@@ -1057,8 +1076,11 @@ tracemalloc_start(int max_nframe)
/* everything is ready: start tracing Python memory allocations */
tracemalloc_config
.
tracing
=
1
;
DEBUG
(
"tracemalloc_start(): set_reentrant(0)"
);
set_reentrant
(
0
);
DEBUG
(
"tracemalloc_start(): done"
);
return
0
;
}
...
...
@@ -1066,14 +1088,18 @@ tracemalloc_start(int max_nframe)
static
void
tracemalloc_stop
(
void
)
{
if
(
!
tracemalloc_config
.
tracing
)
DEBUG
(
"tracemalloc_stop()"
);
if
(
!
tracemalloc_config
.
tracing
)
{
DEBUG
(
"tracemalloc_stop(): exit (not tracing)"
);
return
;
}
/* stop tracing Python memory allocations */
tracemalloc_config
.
tracing
=
0
;
/* set the reentrant flag to detect bugs: fail with an assertion error if
set_reentrant(1) is called while tracing is disabled. */
DEBUG
(
"tracemalloc_stop(): set_reentrant(1)"
);
set_reentrant
(
1
);
/* unregister the hook on memory allocators */
...
...
@@ -1088,6 +1114,7 @@ tracemalloc_stop(void)
/* release memory */
raw_free
(
tracemalloc_traceback
);
tracemalloc_traceback
=
NULL
;
DEBUG
(
"tracemalloc_stop(): done"
);
}
PyDoc_STRVAR
(
tracemalloc_is_tracing_doc
,
...
...
@@ -1455,8 +1482,11 @@ py_tracemalloc_start(PyObject *self, PyObject *args)
}
nframe_int
=
Py_SAFE_DOWNCAST
(
nframe
,
Py_ssize_t
,
int
);
if
(
tracemalloc_start
(
nframe_int
)
<
0
)
if
(
tracemalloc_start
(
nframe_int
)
<
0
)
{
DEBUG
(
"start(): ERROR!"
);
return
NULL
;
}
DEBUG
(
"start(): done"
);
Py_RETURN_NONE
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment