Como executar automaticamente o executável no GDB?

91

Eu gostaria de ter gdbexecutado o executável imediatamente, como se tivesse digitado "run" (motivação: não gosto de digitar "run").

Uma maneira é canalizar o comando para gdbassim:

$ echo run | gdb myApp

Mas o problema com essa abordagem é que você perde interatividade com gdb, por exemplo. se um ponto de interrupção disparar ou myApptravar, gdbfecha. Este método é discutido aqui .

Olhando as opções em --help, não vejo uma maneira de fazer isso, mas talvez esteja faltando alguma coisa.

orion elenzil
fonte

Respostas:

127
gdb -ex run ./a.out

Se você precisar passar argumentos para a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

EDIT: Orion diz que isso não funciona no Mac OSX.

A -exbandeira está disponível desde GDB-6.4(lançada em 2005), mas OSX usa fork do GDB da Apple, e o XCode para Leopard mais recente contém GDB 6.3.50-20050815 (Apple version gdb-967), então você está sem sorte.

Construir a GDB-7.0.1versão atual é uma solução possível. Apenas certifique-se de ler isso .

Russo empregado
fonte
1
obrigado pela resposta. essa linha se comporta da mesma forma que apenas "gdb ./a.out" para mim, embora.
orion elenzil
3
Acabei de confirmar que você também pode passar várias opções -ex na linha de comando e elas serão executadas em ordem antes de transferir a entrada gdb para você.
Tung Nguyen
Esta solução não funciona se o programa tiver argumentos como:./a.out a b
gigilibala
uma vez que o OSX / xcode não suporta mais gdb fora da caixa (lldb é o novo gdb), agora parece ser a melhor abordagem.
orion elenzil
Fiz um arquivo de comando e uso gdb -xem sistemas Linux. OS X usa LLVM e clang, então verifique os recursos de depuração do lldb.
Daisuke Aramaki
22

Eu usaria um script gdb:

gdb -x your-script

onde seu-script contém algo como:

file a.out
b main
r

depois disso, você tem o prompt gdb interativo normal

EDITAR :

aqui está uma otimização para os verdadeiramente preguiçosos:

  1. salve o script como .gdbinitno working directory.
  2. Depois, você simplesmente executa o gdb como

    gdb

... e o gdb carrega e executa automaticamente o conteúdo do .gdbinit.


fonte
ei obrigado pela resposta. parece exatamente o que eu quero, exceto que eu não consigo o prompt do gdb, eu consigo o gdb sendo suspenso e estou de volta à linha de comando como se eu tivesse digitado "ctrl-z". se eu "fg", o gdb é reiniciado e o aplicativo é executado. este é o OS X.
orion elenzil
orion: mmmh - isso é surpreendente para mim. Funciona bem com todos os tipos de UNIX que estou usando (Linux, Solaris, AIX). Qual versão do gdb você está usando?
Acabei de verificar o comportamento disso - ainda sai da linha de comando com gdb suspenso.GNU gdb 6.3.50-20050815 (versão da Apple gdb-1518) (sábado, 12 de fevereiro 02:52:12 UTC 2011).
orion elenzil
@orionelenzil Não tenho ideia do porquê, mas se você colocar fgdepois da rlinha, ele age de forma saudável
dbr
O startcomando fornece um atalho para b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
20
(echo r ; cat) | gdb a.out

O gato permite que você continue digitando após as interrupções do gdb.

cadabra
fonte
uau, incrível. você tem que ctrl-c depois de sair do gdb para parar o gato, mas isso é ótimo.
orion elenzil
3
Parece que você perdeu algum controle de tecla na instância gdb usando isso.
Treviño
Além disso, perguntas como Make breakpoint pending on future shared library load? (y or [n])assumirão automaticamente a resposta "Não".
Ruslan
6

start comando

Este comando é outra boa opção:

gdb -ex start --args ./a.out arg1 arg2

É como executar, mas também define um ponto de interrupção temporário em maine para aí.

Este breakpoint temporário é desativado assim que é atingido.

starti

Há também um relacionado startique inicia o programa e para na primeira instrução, consulte também: Parando na primeira instrução de código de máquina em GDB

Ótimo quando você está fazendo coisas de baixo nível.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fonte
4

gdb -x <(echo run) --args $program $args

metanfetamina
fonte