2016-12-30 2 views
1

т.д .:Как передать аргументы CLI «командам» внутри «define» в GDB?

define mycmd 
    break $arg0 
    commands 
     print $arg0 
    end 
end 
mycmd myfunc 
continue 

Печать:

$1 = void 

вместо ожидаемого myfunc, потому что $arg0 будет evaulated, когда команда попала, и так как он не был определен шоу void.

Есть ли способ передать его commands?

Я думаю, что смогу сделать это с Python легко, но было бы здорово быстрее. Но если у вас готов Python, просто вставьте его в любом случае.

Мотивация: автоматизировать https://stackoverflow.com/a/5372742/895245, где я хотел бы написать:

define break-stack 
    break $arg0 
    commands 
     tbreak $arg1 
     continue 
    end 
end 
break-stack ParentFunc ChildFunc 

Да, я знаю, что https://stackoverflow.com/a/20209911/895245 обеспечивает решение Python.

GDB 7.11, Ubuntu 16.10.

ответ

1

Я не мог коаксировать eval gdb для вычисления многострочных команд, таких как commands, так что вот решение, которое использует shell.

define break-stack 
    dont-repeat 
    break $arg0 
    shell { echo commands; echo tbreak $arg1; echo continue; echo end; } > /tmp/gdbtmp 
    source /tmp/gdbtmp 
    shell rm /tmp/gdbtmp 
end 

Если echo принимает опцию -e, он может быть сокращен до

define break-stack 
    dont-repeat 
    break $arg0 
    shell echo -e "commands\ntbreak $arg1\ncontinue\nend" > /tmp/gdbtmp 
    source /tmp/gdbtmp 
    shell rm /tmp/gdbtmp 
end 

Вашей конкретной задачи - остановки, когда функция б вызывается функция - может быть сделано с помощью $_caller_is функция удобства, которая включена в последние версии gdb.

define break-stack 
    break "$arg1" if $_caller_is("$arg0") 
end 
Смежные вопросы