开发者

Testing if a gdb convenience variable is defined

Is there a way to test if a convenience variable has been set in gdb?

For example:

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

$_exitcode is void because it is not set until the program terminates. The closest available construct is init-开发者_StackOverflowif-undefined, but this would require setting the variable to some sentinel value and testing against that.


Since normal process exit code is somewhere in between 0 and 255, I suggest following:

init-if-undefined $_exitcode = -1
if ($_exitcode != -1)
  quit
end


Im having the same problem.. you can't check if a variable has been set or not as far as I know in GDB.. you could run it through python, probably, and have the whole script run that way, but I am unsure of it the python scripts in GDB are persistent or running all the time. You could do something like..

init-if-undefined $_exitcode = 1
if $_exitcode == 0
quit
end
end


You can define a command in gdb do do what you want as shown:

(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

Now that you have defined CheckDefined, you can use it as shown, to check whether a given convenience variable, in this case $fluffy, is defined, storing the result of the check in $fluffyIsDefined:

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

If you now define the previously undefined variable, $fluffy, CheckDefined will yield a different result:

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

This use of the function has the advantage that you don't have to clobber the variable that you want to check. So to rewrite your original construct:

(gdb) CheckDefined $_exitcode $exitCodeIsDefined
(gdb) if (! $exitCodeIsDefined)
 >quit
 >end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜