]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: add Lua stack dumper
authorQuentin Young <qlyoung@cumulusnetworks.com>
Sun, 11 Aug 2019 19:44:04 +0000 (19:44 +0000)
committerQuentin Young <qlyoung@nvidia.com>
Tue, 1 Dec 2020 23:37:14 +0000 (18:37 -0500)
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/frrlua.c
lib/frrlua.h

index 252b66796110f802721e353a4db829cb5fce6825..15fda79201b3c280e82b71392af6f14be6358547 100644 (file)
@@ -25,6 +25,7 @@
 #include "prefix.h"
 #include "frrlua.h"
 #include "log.h"
+#include "buffer.h"
 
 /*
  * FRR convenience functions.
@@ -170,4 +171,49 @@ void frrlua_export_logging(lua_State *L)
        lua_setfield(L, -2, "log");
 }
 
+/*
+ * Debugging.
+ */
+
+char *frrlua_stackdump(lua_State *L)
+{
+       int top = lua_gettop(L);
+
+       char tmpbuf[64];
+       struct buffer *buf = buffer_new(4098);
+
+       for (int i = 1; i <= top; i++) {
+               int t = lua_type(L, i);
+
+               switch (t) {
+               case LUA_TSTRING: /* strings */
+                       snprintf(tmpbuf, sizeof(tmpbuf), "\"%s\"\n",
+                                lua_tostring(L, i));
+                       buffer_putstr(buf, tmpbuf);
+                       break;
+               case LUA_TBOOLEAN: /* booleans */
+                       snprintf(tmpbuf, sizeof(tmpbuf), "%s\n",
+                                lua_toboolean(L, i) ? "true" : "false");
+                       buffer_putstr(buf, tmpbuf);
+                       break;
+               case LUA_TNUMBER: /* numbers */
+                       snprintf(tmpbuf, sizeof(tmpbuf), "%g\n",
+                                lua_tonumber(L, i));
+                       buffer_putstr(buf, tmpbuf);
+                       break;
+               default: /* other values */
+                       snprintf(tmpbuf, sizeof(tmpbuf), "%s\n",
+                                lua_typename(L, t));
+                       buffer_putstr(buf, tmpbuf);
+                       break;
+               }
+       }
+
+       char *result = XSTRDUP(MTYPE_TMP, buffer_getstr(buf));
+
+       buffer_free(buf);
+
+       return result;
+}
+
 #endif
index f77842b445fca381bfc80777d961e5997e0caa91..bc017b644180789ab20ecffec86ae14fe743a386 100644 (file)
@@ -74,6 +74,13 @@ int frrlua_table_get_integer(lua_State *L, const char *key);
  */
 void frrlua_export_logging(lua_State *L);
 
+/*
+ * Dump Lua stack to a string.
+ *
+ * Return value must be freed with XFREE(MTYPE_TMP, ...);
+ */
+char *frrlua_stackdump(lua_State *L);
+
 #ifdef __cplusplus
 }
 #endif