![为什么 gdb 不喜欢别名](https://linux22.com/image/127186/%E4%B8%BA%E4%BB%80%E4%B9%88%20gdb%20%E4%B8%8D%E5%96%9C%E6%AC%A2%E5%88%AB%E5%90%8D.png)
我创建了一个别名ff
并将其来源自~/.zsh/aliases.zsh
.
别名本身运行良好:
alias ff
ff='firefox --safe-mode'
它按预期运行。
但是当我尝试在下面运行它时,gdb
我得到:
> gdb ff
GNU gdb (Debian 7.12-6+b1) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
...
For help, type "help".
Type "apropos word" to search for commands related to "word"...
ff: No such file or directory.
(gdb) quit
我尝试使用gdb firefox --safe-mode
但那不会运行。
有人可以找出问题所在吗?
答案1
别名是 shell 的一项功能。定义别名会创建新的 shell 命令名。它仅被 shell 识别,并且仅当它作为命令名称出现时才被识别。
例如,如果您输入
> ff
在 shell 提示符下,它将调用您的别名,但如果您输入
> echo ff
这ff
只是一个参数,而不是命令。 (至少在 bash 中,如果别名定义以空格结尾,您可以玩一些技巧。请参阅斯特凡·查泽拉斯的回答如果您决定使用 shell 别名,请参阅可能的解决方案。)
你输入了
> gdb ff
因此 shell 调用了gdb
,将字符串ff
作为参数传递给它。
您可以通过命令行将参数传递给被调试的程序gdb
,但您必须使用该--args
选项。例如:
> gdb firefox --safe-mode
尝试(但失败)将--safe-mode
其视为gdb
.要运行带有参数的命令,您可以手动执行:
> gdb firefox
...
(gdb) run --safe-mode
或者,如特里格的回答提醒我,你可以使用--args
:
> gdb --args firefox --safe-mode
...
(gdb) run
(后面的第一个参数--args
是命令名称;所有剩余参数都传递给调用的命令。)
可以从 shell 别名中提取参数,但我建议只定义一个单独的别名:
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
或者,更好的是使用 shell 函数,它的用途更加广泛。 bash 手册说:
对于几乎所有用途,shell 函数都优于别名。
答案2
不是直接的,但可以通过将 ZSH shell 别名整理成适合gdb
.
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
这会像 ZSH 一样分割别名(更健壮的代码将检查第一个参数是否确实是别名,甚至是否已设置等),然后gdb
通过方便的--args
标志将这些参数提供给(请参阅 参考资料info gdb invocation
)。如果我们然后运行gdb-alias testtest
% gdb-alias testtest
Reading symbols from echo...(no debugging symbols found)...done.
(gdb) r
Starting program: /Users/jhqdoe/usr/Darwin15.6.0-x86_64/bin/echo test test test
test test test
[Inferior 1 (process 93721) exited normally]
(gdb)
这表明echo
(我的大会实施echo
,无论如何)是gdb
通过别名中的参数运行的。
(这可能会在全局别名或任何带有 shell 元字符 foo 的别名上中断,这可能取决于 gdb 是否通过与 ZSH 中可能设置的任何内容兼容的 shell 抛出这些参数,但对于简单x='y z'
类型的东西应该没问题。也许吧。 )
答案3
在 POSIX shell 中,别名仅在命令位置(只要需要命令的地方)或在其扩展以空白字符结尾的别名之后扩展(在 中zsh
,仅一个空格,在许多其他实现中,仅空格或制表符)。您还需要能够将参数传递给正在调试的程序的--args
选项。gdb
所以你可以这样做:
alias gdba='gdb --args ' # note the trailing space which does mean
# that aliases are to be expanded after it
alias ff='firefox --safe-mode'
gdba ff
¹ zsh 还支持全球的别名(带有alias -g
)在更多地方扩展,但您可能不想firefox --safe-mode
在此处使用这样的别名,因为您不希望echo ff
输出除 之外的任何内容ff
。
答案4
您不需要别名来尝试获取gdb
接受参数。
在你的情况下,它将是:
gdb firefox
(gdb) set args --safe-mode