mirror of
https://github.com/fluencelabs/redis
synced 2025-03-28 21:31:03 +00:00
Lua debugger: redis.breakpoint() implemented.
This commit is contained in:
parent
cf4700bda4
commit
3a04cb05ee
@ -65,6 +65,7 @@ struct ldbState {
|
|||||||
int bp[LDB_BREAKPOINTS_MAX]; /* An array of breakpoints line numbers. */
|
int bp[LDB_BREAKPOINTS_MAX]; /* An array of breakpoints line numbers. */
|
||||||
int bpcount; /* Number of valid entries inside bp. */
|
int bpcount; /* Number of valid entries inside bp. */
|
||||||
int step; /* Stop at next line ragardless of breakpoints. */
|
int step; /* Stop at next line ragardless of breakpoints. */
|
||||||
|
int luabp; /* Stop at next line because redis.breakpoint() was called. */
|
||||||
sds *src; /* Lua script source code split by line. */
|
sds *src; /* Lua script source code split by line. */
|
||||||
int lines; /* Number of lines in 'src'. */
|
int lines; /* Number of lines in 'src'. */
|
||||||
int currentline; /* Current line number. */
|
int currentline; /* Current line number. */
|
||||||
@ -702,6 +703,21 @@ int luaRedisReplicateCommandsCommand(lua_State *lua) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* redis.breakpoint()
|
||||||
|
*
|
||||||
|
* Allows to stop execution during a debuggign session from within
|
||||||
|
* the Lua code implementation, like if a breakpoint was set in the code
|
||||||
|
* immediately after the function. */
|
||||||
|
int luaRedisBreakpointCommand(lua_State *lua) {
|
||||||
|
if (ldb.active) {
|
||||||
|
ldb.luabp = 1;
|
||||||
|
lua_pushboolean(lua,1);
|
||||||
|
} else {
|
||||||
|
lua_pushboolean(lua,0);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* redis.set_repl()
|
/* redis.set_repl()
|
||||||
*
|
*
|
||||||
* Set the propagation of write commands executed in the context of the
|
* Set the propagation of write commands executed in the context of the
|
||||||
@ -944,6 +960,11 @@ void scriptingInit(int setup) {
|
|||||||
lua_pushnumber(lua,PROPAGATE_AOF|PROPAGATE_REPL);
|
lua_pushnumber(lua,PROPAGATE_AOF|PROPAGATE_REPL);
|
||||||
lua_settable(lua,-3);
|
lua_settable(lua,-3);
|
||||||
|
|
||||||
|
/* redis.breakpoint */
|
||||||
|
lua_pushstring(lua,"breakpoint");
|
||||||
|
lua_pushcfunction(lua,luaRedisBreakpointCommand);
|
||||||
|
lua_settable(lua,-3);
|
||||||
|
|
||||||
/* Finally set the table as 'redis' global var. */
|
/* Finally set the table as 'redis' global var. */
|
||||||
lua_setglobal(lua,"redis");
|
lua_setglobal(lua,"redis");
|
||||||
|
|
||||||
@ -1465,6 +1486,7 @@ void ldbEnable(client *c) {
|
|||||||
ldb.fd = c->fd;
|
ldb.fd = c->fd;
|
||||||
ldb.step = 1;
|
ldb.step = 1;
|
||||||
ldb.bpcount = 0;
|
ldb.bpcount = 0;
|
||||||
|
ldb.luabp = 0;
|
||||||
sdsfree(ldb.cbuf);
|
sdsfree(ldb.cbuf);
|
||||||
ldb.cbuf = sdsempty();
|
ldb.cbuf = sdsempty();
|
||||||
}
|
}
|
||||||
@ -2008,11 +2030,14 @@ void luaLdbLineHook(lua_State *lua, lua_Debug *ar) {
|
|||||||
lua_getinfo(lua,"Sl",ar);
|
lua_getinfo(lua,"Sl",ar);
|
||||||
if(strstr(ar->short_src,"user_script") == NULL) return;
|
if(strstr(ar->short_src,"user_script") == NULL) return;
|
||||||
|
|
||||||
int bp = ldbIsBreakpoint(ar->currentline);
|
int bp = ldbIsBreakpoint(ar->currentline) || ldb.luabp;
|
||||||
if (ldb.step || bp) {
|
if (ldb.step || bp) {
|
||||||
char *reason = bp ? "break point" : "step over";
|
char *reason = "step over";
|
||||||
|
if (bp) reason = ldb.luabp ? "redis.breakpoint() called" :
|
||||||
|
"break point";
|
||||||
ldb.currentline = ar->currentline;
|
ldb.currentline = ar->currentline;
|
||||||
ldb.step = 0;
|
ldb.step = 0;
|
||||||
|
ldb.luabp = 0;
|
||||||
ldbLog(sdscatprintf(sdsempty(),
|
ldbLog(sdscatprintf(sdsempty(),
|
||||||
"* Stopped at %d, stop reason = %s",
|
"* Stopped at %d, stop reason = %s",
|
||||||
ldb.currentline, reason));
|
ldb.currentline, reason));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user