Hi everyone.
I'm trying to make a simple jump on C funcion trace by frame->f_lineno.
Example is simple, but not working.
if (frame->f_lineno == 12){
frame->f_lineno = 8;
}
attached files C and python to run test.
the line 12 I need to jump to line 8.
Att.
Leandro Müller
import importlib
import tracesys
import sys
import os
def teste():
print("7")
print("8")
print("9")
print("10")
print("11")
print("12")
print("13")
print("14")
def get_module_to_file( ):
SY_BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)) +
"/%s" % ("W64"))
SY_BASE_DIR = SY_BASE_DIR.replace("\\", "/")
path1 = os.path.join(SY_BASE_DIR)
path1 = path1 + "/check.py"
filename = os.path.realpath(path1)
filename = filename.replace("\\", "/")
filename = filename.replace(SY_BASE_DIR, ".")
return filename
file = get_module_to_file()
# print(file)
# from threading import Thread
# t = Thread(target=teste)
# t.start()
tracesys.sys_settrace("lmuller", "session_login" )
tracesys.add_debug("lmuller", file,8, "lmuller", "session_login" )
teste()
print("fim")
# t = input()
from distutils.core import setup, Extension
module = Extension("tracesys",sources = ["trace.cpp"])
setup(name="Traca Package", version="1.0",description="Trace process",
ext_modules= [module])
#include "Python.h"
#include "frameobject.h"
#include <vector>
#include <iostream>
#include <exception>
using namespace std;
typedef struct t_debug
{
char *user_debug;
char *user_console;
char *file;
int line;
char *id_wp;
char *session_login;
char *sessionid;
int *last;
} * st_debug;
static vector<t_debug> *list_debug = new vector<t_debug>();
static vector<st_debug> *list_debug_urgent = new vector<st_debug>();
char *user_console;
char *session_login;
char *sessionid;
static int conta = 0;
char *ReplaceAll(char *str1, const std::string &from, const std::string &to)
{
size_t start_pos = 0;
std::string str = str1;
while ((start_pos = str.find(from, start_pos)) != std::string::npos)
{
str.replace(start_pos, from.length(), to);
start_pos += to.length();
}
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
return cstr;
}
char *get_variable_char(PyObject *obj, int position)
{
PyObject *repr = PyObject_Repr(PyTuple_GetItem(obj, position));
PyObject *str = PyUnicode_AsEncodedString(repr, "utf-8", NULL);
char *s = PyBytes_AS_STRING(str);
string st = s;
if (st.length() < 2)
{
return "";
}
st = st.substr(1, st.length() - 2);
s = new char[st.length() + 1];
strcpy(s, st.c_str());
printf("%s \n", s);
return s;
}
int get_variable_int(PyObject *obj, int position)
{
return PyLong_AsLong(PyTuple_GetItem(obj, position));
}
int has_debug_session(char *user_console, char *file, int line, char
*session_login)
{
int ret = -1;
try
{
size_t size = list_debug->size();
for (size_t i = 0; i < size; i++)
{
t_debug objl = list_debug->at(i);
if (strcmp(objl.user_console, user_console) == 0 &&
strcmp(objl.file, file) == 0 && (objl.line == line) &&
strcmp(objl.session_login, session_login) == 0)
{
ret = 0;
break;
}
}
}
catch (exception &e)
{
cout << "error process " << e.what() << '\n';
}
return ret;
}
int can_debug_session(char *user_c, char *file, int line, char *session_login)
{
try
{
size_t size = list_debug->size();
for (size_t i = 0; i < size; i++)
{
t_debug objl = list_debug->at(i);
if (strcmp(objl.user_console, user_c) == 0 &&
strcmp(objl.user_debug, user_c) == 0 &&
strcmp(objl.file, file) == 0 && (objl.line == line) &&
strcmp(objl.session_login, session_login) == 0)
{
return 0;
}
if (strcmp(objl.user_console, user_c) == 0 &&
!strcmp(objl.user_debug, user_c) == 0 &&
strcmp(objl.file, file) == 0 && (objl.line == line) &&
!strcmp(objl.session_login, session_login) == 0)
{
return 0;
}
}
}
catch (exception &e)
{
cout << "error process " << e.what() << '\n';
}
return -1;
}
int has_debug_urgent(char *sessionid)
{
int ret = -1;
try
{
size_t size = list_debug_urgent->size();
for (size_t i = 0; i < size; i++)
{
st_debug objl = list_debug_urgent->at(i);
if (strcmp(objl->sessionid, sessionid))
{
ret = 0;
break;
}
}
}
catch (exception &e)
{
cout << "error process " << e.what() << '\n';
}
return ret;
}
PyObject *add_debug_urgent(PyObject *mod, PyObject *obj)
{
Py_Initialize();
st_debug dict;
dict->sessionid = get_variable_char(obj, 0);
dict->session_login = get_variable_char(obj, 1);
if (has_debug_urgent(dict->sessionid) == -1)
{
list_debug_urgent->push_back(dict);
}
else
{
size_t size = list_debug_urgent->size();
for (size_t i = 0; i < size; i++)
{
st_debug objl = list_debug_urgent->at(i);
if (strcmp(objl->sessionid, sessionid))
{
objl->session_login = session_login;
break;
}
}
}
Py_Finalize();
return Py_None;
}
//char *user_console , char *file, int *line, char *user_debug, char
*session_login
static PyObject *add_debug(PyObject *mod, PyObject *obj)
{
t_debug dict;
dict.user_console = get_variable_char(obj, 0);
dict.file = get_variable_char(obj, 1);
dict.line = get_variable_int(obj, 2);
dict.user_debug = get_variable_char(obj, 3);
dict.session_login = get_variable_char(obj, 4);
if (has_debug_session(dict.user_console, dict.file, dict.line,
dict.session_login) == -1)
{
list_debug->push_back(dict);
}
return Py_BuildValue("s", "");
}
static PyObject *remove_debug_urgent(char *sessionid)
{
size_t size = list_debug_urgent->size();
for (size_t i = 0; i < size; i++)
{
st_debug objl = list_debug_urgent->at(i);
if (strcmp(objl->sessionid, sessionid))
{
list_debug_urgent->erase(list_debug_urgent->begin() + i - 1);
break;
}
}
return Py_None;
}
//char *user_console, char *file, int *line
static PyObject *remove_debug(PyObject *mod, PyObject *obj)
{
char *user_console = get_variable_char(obj, 0);
char *file = get_variable_char(obj, 1);
int line = get_variable_int(obj, 2);
char *session_login = get_variable_char(obj, 3);
size_t size = list_debug->size();
for (size_t i = 0; i < size; i++)
{
t_debug objl = list_debug->at(i);
if (strcmp(objl.user_console, user_console) == 0 && strcmp(objl.file,
file) == 0 && (objl.line == line) &&
strcmp(objl.session_login, session_login) == 0)
{
list_debug->erase(list_debug->begin() + i - 1);
break;
}
}
return Py_BuildValue("s", "");
}
int trace_trampoline(
PyObject *obj, PyFrameObject *frame, int event, PyObject *arg)
{
PyObject *rfile = PyObject_Repr(frame->f_code->co_filename);
PyObject *sfile = PyUnicode_AsEncodedString(rfile, "utf-8", "strict");
char *file = PyBytes_AS_STRING(sfile);
file = ReplaceAll(file, "\\", "/");
file = ReplaceAll(file, "//", "/");
int l = frame->f_lineno;
if (l == 12 && strcmp(file, "'./check.py'") == 0 && conta == 0)
{
printf("last %i %i \n", frame->f_lineno, frame->f_lasti);
frame->f_lineno = 8;
conta++;
frame_setlineno
return 0;
}
return 0;
}
PyObject *sys_settrace(PyObject *mod, PyObject *obj)
{
user_console = get_variable_char(obj, 0);
session_login = get_variable_char(obj, 1);
PyEval_SetTrace(trace_trampoline, obj);
// Py_CLEAR(pName);
// Py_CLEAR(pModule);
return Py_None;
}
PyObject *clear_trace(PyObject *mod)
{
// Py_CLEAR(trace_dispatch_c);
return Py_None;
}
static PyMethodDef myMethods[] = {
{"sys_settrace", (PyCFunction)sys_settrace, METH_VARARGS, "settrace"},
{"add_debug", (PyCFunction)add_debug, METH_VARARGS, "add_debug"},
{"remove_debug", (PyCFunction)remove_debug, METH_VARARGS, ""},
{"add_debug_urgent", (PyCFunction)add_debug_urgent, METH_VARARGS, ""},
{NULL, NULL, 0, NULL}};
static struct PyModuleDef trace_module = {
PyModuleDef_HEAD_INIT,
"tracesys",
"Trace",
-1,
myMethods};
PyMODINIT_FUNC PyInit_tracesys(void)
{
PyObject *m = PyModule_Create(&trace_module);
PyModule_AddObject(m, "version", PyLong_FromLong(2));
return m;
}
_______________________________________________
Python-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/7RZX4MUF6GLPU4DVXLRTQ534TDRXRL36/
Code of Conduct: http://python.org/psf/codeofconduct/