为什么 gdb 不喜欢别名

shi*_*ish 10 linux shell alias gdb

我创建了一个别名ff并从~/.zsh/aliases.zsh.

别名本身运行良好:

alias ff
ff='firefox --safe-mode'
Run Code Online (Sandbox Code Playgroud)

它按预期运行。

但是当我尝试在下面运行它时,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
Run Code Online (Sandbox Code Playgroud)

我尝试使用,gdb firefox --safe-mode但不会运行。

有人可以识别出什么问题吗?

Kei*_*son 20

别名是 shell 的一个特性。定义别名会创建一个新的 shell 命令名称。它只能被 shell 识别,并且只有当它作为命令名称出现时。

例如,如果您键入

> ff
Run Code Online (Sandbox Code Playgroud)

在 shell 提示符下,它会调用您的别名,但如果您键入

> echo ff
Run Code Online (Sandbox Code Playgroud)

ff只是一个参数,而不是命令。(至少在 bash 中,如果别名定义以空格结尾,您可以玩一些技巧。如果您决定使用 shell 别名,请参阅Stéphane Chazelas 的答案以获取可能的解决方案。)

你打字

> gdb ff
Run Code Online (Sandbox Code Playgroud)

所以外壳调用了gdb,将字符串ff作为参数传递给它。

您可以通过gdb命令行将参数传递给被调试的程序,但您必须使用该--args选项。例如:

> gdb firefox --safe-mode
Run Code Online (Sandbox Code Playgroud)

尝试(但失败)将其--safe-mode视为gdb. 要使用参数运行命令,您可以手动执行此操作:

> gdb firefox
...
(gdb) run --safe-mode
Run Code Online (Sandbox Code Playgroud)

或者,正如thrig 的回答提醒我的那样,您可以使用--args

> gdb --args firefox --safe-mode
...
(gdb) run
Run Code Online (Sandbox Code Playgroud)

(后面的第一个参数--args是命令名称;所有剩余的参数都传递给调用的命令。)

可以从 shell 别名中提取参数,但我建议只定义一个单独的别名:

alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
Run Code Online (Sandbox Code Playgroud)

或者,更好的是使用 shell 函数,它的用途要广泛得多。bash手册说:

对于几乎所有用途,shell 函数都比别名更受欢迎。

  • 基思:从那个页面的第二个graf:“如果别名值的最后一个字符是空白,那么别名后面的下一个命令字也会被检查别名扩展。” [和 POSIX 相同。](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_03_01) 虽然在这种情况下你需要 `alias gdb='gdb --args'`.Shell函数通常在 shell 中更好,对于 bash 甚至在子 shell 模 shellshock 中,但不是像 gdb 这样的其他程序。 (6认同)

thr*_*rig 5

不是直接的,但是可以通过将 ZSH shell 别名进行一些处理来转换为适合gdb.

alias testtest='echo test test test'

function gdb-alias() {
   local cmdargs
   cmdargs=( ${(z)${aliases[$1]}} )
   gdb -q --args $cmdargs
}
Run Code Online (Sandbox Code Playgroud)

这会像 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) 
Run Code Online (Sandbox Code Playgroud)

这表明echo(无论如何,我的程序集实现echo)是gdb使用别名中的参数运行的。

(这可能会中断全局别名,或者任何带有 shell 元字符 foo 的别名,这可能取决于 gdb 是否通过与 ZSH 中设置的任何内容兼容的 shell 抛出这些参数,但对于简单x='y z'类型的东西应该没问题。也许。 )