diff --git a/src/lua/bcc/table.lua b/src/lua/bcc/table.lua
index af269d81eb7feddcba9e1ed8b550255dc5ec0c28..35d93edcd775331a72b97856bba6d8325714addb 100644
--- a/src/lua/bcc/table.lua
+++ b/src/lua/bcc/table.lua
@@ -254,9 +254,9 @@ function PerfEventArray:_open_perf_buffer(cpu, callback, ctype)
   self._callbacks[cpu] = _cb
 end
 
-function PerfEventArray:open_perf_buffer(callback, data_type)
+function PerfEventArray:open_perf_buffer(callback, data_type, ...)
   assert(data_type, "a data type is needed for callback conversion")
-  local ctype = ffi.typeof(data_type.."*")
+  local ctype = ffi.typeof(data_type.."*", ...)
   for i = 0, Posix.cpu_count() - 1 do
     self:_open_perf_buffer(i, callback, ctype)
   end
diff --git a/tools/stacksnoop.lua b/tools/stacksnoop.lua
index af9284e79fde54c8cf8b33fc09cf4116f813436b..8f5f5b4fa8857be8dc530947f255e7490d49a2c2 100755
--- a/tools/stacksnoop.lua
+++ b/tools/stacksnoop.lua
@@ -100,12 +100,8 @@ return function(BPF, utils)
 
   local TASK_COMM_LEN = 16 -- linux/sched.h
 
-  bpf:get_table("events"):open_perf_buffer(print_event, [[
-    struct {
-      uint64_t stack_id;
-      uint32_t pid;
-      char comm[%d];
-    }
-  ]] % {TASK_COMM_LEN})
+  bpf:get_table("events"):open_perf_buffer(print_event,
+    "struct { uint64_t stack_id; uint32_t pid; char comm[$]; }",
+    TASK_COMM_LEN)
   bpf:kprobe_poll_loop()
 end