【问题标题】:Readline application name读取应用程序名称
【发布时间】:2014-11-28 03:37:05
【问题描述】:

Readline 手册描述了可用的条件构造 here。特别是,手册说

应用程序构造用于包含特定于应用程序的设置。每个使用 Readline 库的程序都会设置应用程序名称,您可以测试特定值。这可用于将键序列绑定到对特定程序有用的功能。例如,以下命令添加一个键序列,引用 Bash 中的当前或上一个单词:

$if Bash

# Quote the current or previous word "\C-xq": "\eb\"\ef\""

$endif

给定一个使用 readline 库的应用程序,如何找出它为“应用程序名称”设置的值?

【问题讨论】:

    标签: bash readline


    【解决方案1】:

    理想的解决方案是阅读应用程序的文档,这无疑会在有关readline 的部分中告诉您。 (是的,那是个玩笑。)

    这是一种可能有效的技术:

    带有调试符号的应用程序的脚本:

    
    $ gdb the_application
    ...
    Reading symbols from /usr/local/bin/the_application...done.
    (gdb) b rl_initialize
    Breakpoint 1 at 0x496180: file readline.c, line 1050.
    (gdb) r
    Starting program: /usr/local/bin/the_application 
    
    Breakpoint 1, rl_initialize () at readline.c:1050
    1050    {
    (gdb) p rl_readline_name
    $1 = 0x4d1fbb "TheApplication"
    

    一个更可能的带有没有调试符号的应用程序的脚本:

    
    $ gdb the_application
    ...
    Reading symbols from /bin/bash...(no debugging symbols found)...done.
    (gdb) break rl_initialize
    Breakpoint 1 at 0x48df40
    (gdb) r
    Starting program: /usr/bin/local/the_application
    
    Breakpoint 1, 0x000000000048df40 in rl_initialize ()
    (gdb) p (char*)rl_readline_name
    $1 = 0x4b0bcb "TheApplication"
    

    【讨论】:

    • 我在尝试打印名称时收到error: Cannot access memory at address。在基本的 rl 应用程序中添加 println 会产生“其他”。不是很歧视..
    • @olejorgenb:如果您正在编写 rl 应用程序,则设置应用程序名称是您的责任;如果您不这样做,readlune 库将不会为您执行此操作。如果您希望其他人使用您的应用程序,您应该记录您设置的名称。 (事实上​​几乎没有人愿意这样做是答案开头开玩笑的基础。)
    • 是的,尽管从文档中不是特别清楚,但还是弄清楚了。 (虽然这不是我的 rl 应用程序,但我在补丁中包含了更改)
    • @olejorgenb:在针对 bash 进行测试时,我收到了相同的 error: Cannot access memory at address 错误。我决定我需要一些gdb 练习,所以我花了一些时间试图弄清楚。我正在使用 bash 并决定自己构建它,它具有调试符号。 @rici 的指示就像一个魅力。然后,我回到了发行版 bash。 info address rl_readline_name 给了我rl_readline_name 的地址。然后x/a 0x1000bff38 给了我它指向的地址。最后x/s 0x10009f18b给了我正确的答案; “重击”。
    猜你喜欢
    • 2016-07-07
    • 2015-09-16
    • 2014-01-19
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    相关资源
    最近更新 更多