undisplay命令必须指定编号而非变量名,否则报错;需先用info display查看编号,再用undisplay <num>删除或undisplay清空全部;disable仅临时禁用,undisplay才彻底移除且不可逆。

undisplay 命令必须带编号,不能直接跟变量名
很多人输 undisplay var_name 会报错:Undefined command: "undisplay var_name". Try "help". ——因为 undisplay 不接受变量名,只接受 display 列表里的序号。
正确做法是先用 info display 查出当前所有自动显示项及其编号,再用 undisplay <num> 逐个取消:
-
info display输出类似:Auto-display expressions now in effect: Num Enb Expression 2: y i 3: y sum 4: y $1
- 要取消第 3 项,就输:
undisplay 3 - 想一次清空全部,可以用
undisplay(不带参数),它会提示确认,输入y即可
display 被禁用后仍留在列表里,undisplay 才真正删除
disable display <num> 只是临时关闭某项的自动显示(状态变成 n),但它还在 info display 列表中;而 undisplay <num> 是彻底移除这一条,后续 info display 就看不到它了。
容易混淆的点:
- 禁用 ≠ 删除:禁用后还能用
enable display <num>恢复 - 删除后无法恢复:
undisplay是不可逆操作,想再看就得重新display - 编号不重排:删掉第 2 项后,原来的第 3 项还是编号 3,不会变成 2
调试中途修改 display 容易漏掉未生效的项
如果你在函数内设了 display,然后 finish 或 until 跳出该函数,那些依赖局部变量的 display 项会失效(比如显示 <optimized out></optimized> 或报 No symbol "i" in current context),但它们依然留在列表里,编号也不变。
这时候:
- 别指望它自动消失,得手动
undisplay - 别靠
info display的输出判断“是否还在作用域”,要看实际每次停顿时有没有值 - 如果 display 的是寄存器(如
$rax)或全局变量,一般不受函数跳转影响;但局部变量、临时表达式(如*(int*)$rsp)极易断链
info display 扫一眼,有可疑项立刻 undisplay。


















