Проверка, определена ли вспомогательная переменная GDB - PullRequest
7 голосов
/ 19 сентября 2010

Есть ли способ проверить, установлена ​​ли вспомогательная переменная в gdb?

Например:

(gdb) if $_exitcode == 0
 >quit
 >end
Invalid type combination in equality test.
(gdb) p $_exitcode
$1 = void

$_exitcode равно voidпотому что он не установлен, пока программа не завершится.Самая близкая доступная конструкция - init-if-undefined, но для этого потребуется установить для переменной значение некоторого дозорного значения и проверить его.

Ответы [ 3 ]

4 голосов
/ 23 декабря 2011

Поскольку нормальный код завершения процесса находится где-то между 0 и 255, я предлагаю следующее:

init-if-undefined $_exitcode = -1
if ($_exitcode != -1)
  quit
end
2 голосов
/ 09 июля 2011

У меня та же проблема ... вы не можете проверить, установлена ​​ли переменная или нет, насколько я знаю в GDB ... вы могли бы запустить ее через python, возможно, и таким образом запустить весь скрипт но я не уверен, что скрипты Python в GDB постоянны или работают постоянно. Вы могли бы сделать что-то вроде ..

init-if-undefined $_exitcode = 1
if $_exitcode == 0
quit
end
end
0 голосов
/ 15 марта 2019

Вы можете определить команду в GDB делать то, что вы хотите, как показано:

(gdb) define CheckDefined
Type commands for definition of "CheckDefined".
End with a line saying just "end".
>set $CheckDefined_DefinedOr1 = $arg0
>init-if-undefined $CheckDefined_DefinedOr1 = 1
>set $CheckDefined_DefinedOr2 = $arg0
>init-if-undefined $CheckDefined_DefinedOr2 = 2
>set $arg1 = ($CheckDefined_DefinedOr1 == $CheckDefined_DefinedOr2)
>end

Теперь, когда вы определили CheckDefined, вы можете использовать ее, как показано, чтобы проверить, является ли данная вспомогательная переменная, вв этом случае $ fluffy, определяется, сохраняя результат проверки в $ fluffyIsDefined:

(gdb) CheckDefined $fluffy $fluffyIsDefined
(gdb) print $fluffyIsDefined
$17 = 0

Если вы теперь определите ранее неопределенную переменную, $ fluffy, CheckDefined даст другой результат:

(gdb) set $fluffy = 92
(gdb) CheckDefined $fluffy $fluffyIsDefined
(gdb) print $fluffyIsDefined
$18 = 1

Преимущество использования этой функции заключается в том, что вам не нужно забивать переменную, которую вы хотите проверить.Итак, чтобы переписать вашу оригинальную конструкцию:

(gdb) CheckDefined $_exitcode $exitCodeIsDefined
(gdb) if (! $exitCodeIsDefined)
 >quit
 >end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...