为什么 gdb 不喜欢别名

为什么 gdb 不喜欢别名

我创建了一个别名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

相关内容