Closed DanielTimLee closed 5 years ago
It's caused due to null pointer dereference.
1047│ static void print_graph_indent(struct tui_graph *graph,
1048│ struct tui_graph_node *node,
1049│ int depth, bool single_child)
1050│ {
1051│ int i;
1052├───────> struct tui_graph_node *parent = (void *)node->n.parent;
1053│
1054│ for (i = 0; i < depth; i++) {
1055│ if (!graph->disp_mask[i]) {
1056│ printw(" ");
1057│ continue;
1058│ }
1059│
1060│ if (i < depth - 1 || single_child)
1061│ printw(" │");
1062│ else if (is_last_child(parent, node))
1063│ printw(" └");
1064│ else
1065│ printw(" ├");
1066│ }
1067│ }
(gdb) p node
$1 = (struct tui_graph_node *) 0x0
Here is the backtrace info.
(gdb) bt
#0 0x0000000000411dfc in print_graph_indent (graph=0x79fed0, node=0x0, depth=0, single_child=true) at /home/honggyu/work/uftrace/git/uftrace/cmds/tui.c:1052
#1 0x0000000000411f22 in win_display_graph (win=0x79fed0, node=0x0) at /home/honggyu/work/uftrace/git/uftrace/cmds/tui.c:1082
#2 0x0000000000413e1c in tui_window_display (win=0x79fed0, full_redraw=true, handle=0x7fffffffdef0) at /home/honggyu/work/uftrace/git/uftrace/cmds/tui.c:1887
#3 0x0000000000415499 in tui_main_loop (opts=0x7fffffffe130, handle=0x7fffffffdef0) at /home/honggyu/work/uftrace/git/uftrace/cmds/tui.c:2477
#4 0x00000000004156e2 in command_tui (argc=0, argv=0x7fffffffe388, opts=0x7fffffffe130) at /home/honggyu/work/uftrace/git/uftrace/cmds/tui.c:2535
#5 0x000000000040763c in main (argc=0, argv=0x7fffffffe388) at /home/honggyu/work/uftrace/git/uftrace/uftrace.c:1085
Thanks for the report. The below patch should fix it
diff --git a/cmds/tui.c b/cmds/tui.c
index 3c051712..bc09bc60 100644
--- a/cmds/tui.c
+++ b/cmds/tui.c
@@ -946,7 +946,7 @@ static void win_header_graph(struct tui_window *win,
if (list_empty(&graph_output_fields)) {
printw("%-*.*s", COLS, COLS, "uftrace graph TUI");
- return;
+ goto out;
}
buf = p = xmalloc(w + 1);
@@ -962,6 +962,7 @@ static void win_header_graph(struct tui_window *win,
printw("%-*.*s", COLS, COLS, buf);
free(buf);
+out:
/* start with same make as top */
graph->disp = graph->win.top;
graph->disp_depth = graph->top_depth;
It works fine. Thanks!
uftrace graph TUI
(1) t-abc
├─(1) __monstartup
│
├─(1) __cxa_atexit
│
└─(1) main
(1) a
(1) b
(1) c
(1) getpid
As issue title presents, using
-f none
causes a segfault.