如何在GDB中自动运行可执行文件?

如何在GDB中自动运行可执行文件?,gdb,Gdb,我希望gdb立即运行可执行文件,就像我键入“run”一样 (动机:我不喜欢输入“run”) 一种方法是通过管道将命令发送到gdb,如下所示: $ echo run | gdb myApp 但是这种方法的问题是,您失去了与gdb的交互性, 例如,如果断点触发或myApp崩溃,gdb退出。 讨论了该方法 查看--help中的选项,我看不到实现这一点的方法,但可能我遗漏了一些东西。我会使用gdb脚本: gdb -x your-script 脚本中包含以下内容: file a.out b main

我希望
gdb
立即运行可执行文件,就像我键入“run”一样 (动机:我不喜欢输入“run”)

一种方法是通过管道将命令发送到
gdb
,如下所示:

$ echo run | gdb myApp
但是这种方法的问题是,您失去了与
gdb
的交互性, 例如,如果断点触发或
myApp
崩溃,
gdb
退出。 讨论了该方法


查看
--help
中的选项,我看不到实现这一点的方法,但可能我遗漏了一些东西。

我会使用gdb脚本:

gdb -x your-script
脚本中包含以下内容:

file a.out
b main
r
之后,您将看到正常的交互式gdb提示符

编辑

下面是一个针对真正懒惰者的优化:

  • 将脚本另存为
    .gdbinit
    工作目录中
  • 之后,您只需将gdb作为

    gdb

  • 。。。gdb会自动加载并执行.gdbinit的内容

    gdb -ex run ./a.out
    
    如果需要将参数传递给
    a.out

    gdb -ex run --args ./a.out arg1 arg2 ...
    
    编辑: 说这在MacOSX上不起作用

    -ex
    标志自2005年发布以来一直可用,但OSX使用苹果的GDB分叉,而Leopard的最新XCode包含
    GDB 6.3.50-20050815(苹果版本GDB-967)
    ,所以你运气不好

    构建当前版本的GDB-7.0.1是一种可能的解决方案。一定要阅读


    cat允许您在gdb中断后继续键入。

    gdb-x
    start
    命令

    此命令是另一个好选项:

    gdb -ex start --args ./a.out arg1 arg2
    
    它类似于run,但也在
    main
    处设置一个临时断点并在那里停止

    此临时断点一旦被命中即被停用

    starti

    还有一个相关的
    starti
    ,它启动程序并在第一条指令处停止,另请参见:


    当你在做一些低级的事情时,感觉很棒。

    嘿,谢谢你的回答。这看起来正是我想要的,除了我没有得到gdb提示符,我得到gdb被暂停,我回到命令行,好像我输入了“ctrl-z”。如果我选择“fg”,则gdb将恢复,应用程序将运行。这是OS X。猎户座:嗯,这让我很惊讶。与我实际使用的每种UNIX风格(Linux、Solaris、AIX)都能很好地配合使用。您使用的是什么gdb版本?我刚刚验证了这一行为-我仍然会退出到命令行w/gdb suspended.GNU gdb 6.3.50-20050815(苹果版本gdb-1518)(Sat Feb 12 02:52:12 UTC 2011)。@orionelenzil不知道为什么,但是如果您在
    r
    行之后放置
    fg
    ,它正常工作
    start
    命令提供了
    b
    +
    r
    的快捷方式:谢谢您的回答。该行的行为与我的“gdb./a.out”相同。我刚刚确认,您也可以在命令行上传递多个-ex选项,并且在将gdb输入传输给您之前,它们将按顺序运行。如果程序具有如下参数:
    /a.out a b
    ,则此解决方案不起作用,因为OSX/xcode不再支持开箱即用的gdb(lldb是新的gdb),这现在似乎是更好的方法。我制作了一个命令文件,并在Linux系统上使用了
    gdb-x
    。OS x使用LLVM和clang,所以请查看
    lldb
    的调试功能。哇,太棒了。退出gdb后必须按住ctrl-c键才能停止cat,但这太棒了。看起来使用t时gdb实例失去了一些键控制此外,像
    在将来的共享库加载时使断点挂起?(y或[n])
    之类的问题将自动假定答案为“否”。
    gdb -ex start --args ./a.out arg1 arg2