27

如果我使用源窗口调试文件gdb -tui总是会变得一团糟。所以每次我点击enter我都必须立即输入ctrl+L来摆脱这个问题,这就是gdb刷新窗口的方式。我正在使用 gnu 屏幕处理 tty。

是否有可能在 tui 模式下自动刷新 gdb?
如果 gdb 没有这种能力,Python 可能是一个解决方案,因为 gdb 能够获取 Python 文件,但我不了解 Python。

这个 Python 片段在 Bash 中运行良好,但在 gdb 中运行良好:

import sys
r = "\033[2J"    # here I try to emulate [ctrl-L]
t = ""
while 1:
    i = sys.stdin.read(1)
    t = t +i
    if i == '\n':
        print(r)

当然,我接受 gdb 支持的所有其他语言。
感谢您的每一次帮助。

顺便说一句,这是一个截屏视频https://youtu.be/DqiH6Jym1JY,它显示了我的问题。

这是我用于在 gdb 中演示的文件,如上面显示的链接 mess_up.c

#include <stdio.h>

int main(void){
    //int n = 120;
    int n;
    n = 120;
    char stuff[n+2];

    printf( "Max: %d\n", n );

    printf( "Sizeof int:  %d\n", sizeof(int)  );
    printf( "Sizeof char: %d\n", sizeof(char) );
    printf( "Sizeof n:  %d\n", sizeof n   );
    printf( "Sizeof stuff: %d\n", sizeof stuff  );

    fgets ( stuff , n , stdin );
    printf( "The stuff:\n%s\n", stuff );
    printf( "Sizeof stuff after input = %d\n", sizeof stuff  );

return 0;
}

我显示的实际 ncurses 版本tic -Vncurses 5.9.20140118

4

2 回答 2

17

有完全相同的问题。您是否尝试过 GDB 用户定义的钩子或命令?

在您的 ~/.gdbinit 或您的会话中,您可以执行以下操作:

define hook-next
  refresh
end

这将在refresh您每次输入next命令或其别名之一时调用该命令。

或者您可以定义:

define mynext
  next
  refresh
end

并调用mynext而不是next.

每当输入命令 C 并且存在 hook-C 时,都会自动调用钩子,这太酷了,我刚刚在文档中发现了这一点。

请参阅https://sourceware.org/gdb/current/onlinedocs/gdb/Define.htmlhttps://sourceware.org/gdb/current/onlinedocs/gdb/Hooks.html#Hooks

您可以根据需要添加任意数量的挂钩/定义。

于 2018-01-12T15:32:46.187 回答
7

部分相关:我把它放在我的 ~/.gdbinit 中,它在我使用cand后成功刷新了 TUI n,在我的情况下,这些命令通常会导致 TUI 混乱。

define c 
  continue
  refresh
end

define n
  next
  refresh
end
于 2020-03-07T17:15:41.627 回答