summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-02-18 16:41:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-02-18 16:41:31 (GMT)
commitdeb012d919ea6c5e79702a39a03a85be2ffcf406 (patch)
treeae9cee108d05e0a6674d8617a08d0ea09165443c /plugins
parent73605bffb935fc51a52be1936426211e31dd898a (diff)
Retrieved the frames stack from the running process.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@235 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'plugins')
-rw-r--r--plugins/pyoida/debug/debugger.c40
-rw-r--r--plugins/python/exectracer/exectracer.py10
2 files changed, 45 insertions, 5 deletions
diff --git a/plugins/pyoida/debug/debugger.c b/plugins/pyoida/debug/debugger.c
index 75de6d8..3e42ab7 100644
--- a/plugins/pyoida/debug/debugger.c
+++ b/plugins/pyoida/debug/debugger.c
@@ -25,6 +25,7 @@
#include "debugger.h"
+#include <malloc.h>
#include <pygobject.h>
@@ -36,7 +37,7 @@
static PyObject *py_binary_debugger_list_all_threads(PyObject *, PyObject *);
/* Fournit la pile d'exécution courante via un débogueur. */
-static PyObject *py_binary_debugger_get_current_stack(PyObject *, PyObject *);
+static PyObject *py_binary_debugger_get_frames_stack(PyObject *, PyObject *);
@@ -171,9 +172,38 @@ static PyObject *py_binary_debugger_list_all_threads(PyObject *self, PyObject *a
* *
******************************************************************************/
-static PyObject *py_binary_debugger_get_current_stack(PyObject *self, PyObject *args)
+static PyObject *py_binary_debugger_get_frames_stack(PyObject *self, PyObject *args)
{
- return PyLong_FromLong(23);
+ PyObject *result; /* Trouvailles à retourner */
+ GBinaryDebugger *debugger; /* Version native */
+ unsigned long thread; /* Identifiant du thread visé */
+ size_t count; /* Taille de cette liste */
+ dbg_frame_t *frames; /* Frames courantes trouvées */
+ size_t i; /* Boucle de parcours */
+ PyObject *frame; /* Détails sur une frame */
+
+ debugger = G_BINARY_DEBUGGER(pygobject_get(self));
+
+ if (!PyArg_ParseTuple(args, "k", &thread))
+ return Py_None;
+
+ frames = g_binary_debugger_get_frames_stack(debugger, thread, &count);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ frame = PyTuple_New(1);
+ PyTuple_SetItem(result, i, frame);
+
+ PyTuple_SetItem(frame, 0, PyLong_FromUnsignedLongLong(frames[i].addr));
+
+ }
+
+ if (frames != NULL)
+ free(frames);
+
+ return result;
}
@@ -205,8 +235,8 @@ bool register_python_binary_debugger(PyObject *module)
"List all current active threads."
},
{
- "get_current_stack", (PyCFunction)py_binary_debugger_get_current_stack,
- METH_NOARGS,
+ "get_frames_stack", (PyCFunction)py_binary_debugger_get_frames_stack,
+ METH_VARARGS,
"Provide the current callstack using a debugger."
},
{ NULL }
diff --git a/plugins/python/exectracer/exectracer.py b/plugins/python/exectracer/exectracer.py
index 898f0be..76e2ce4 100644
--- a/plugins/python/exectracer/exectracer.py
+++ b/plugins/python/exectracer/exectracer.py
@@ -21,3 +21,13 @@ class ExecTracer(Plugin):
for i in debugger.list_all_threads():
print "Thread %d '%s'" % (i[0], i[1])
+
+ frames = debugger.get_frames_stack(i[0])
+
+ for frame in frames:
+ print " 0x%08x" % frame[0]
+
+ if len(frames) == 0:
+ print " -"
+
+