mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
260 lines
7.4 KiB
Plaintext
260 lines
7.4 KiB
Plaintext
# -*- gdb-script -*-
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
# Interactive commands to help inspecting ActionScript execution state while debugging in gdb.
|
|
#
|
|
# To use this file, type from the gdb prompt:
|
|
# source $(hg root)/utils/as3.gdbinit
|
|
# or include in your .gdbinit.
|
|
#
|
|
# See gdb help for individual commands.
|
|
#
|
|
# In case of undefined symbols, try running the gdb 'where' command before aswhere.
|
|
#
|
|
# Typical use case:
|
|
# (gdb) run
|
|
# ^C
|
|
# (gdb) where
|
|
# (gdb) aswhere
|
|
# (gdb) asframe 4 # select 4th AS3 frame from the top
|
|
# (gdb) aslocal # print locals
|
|
# (gdb) aslocal 2 # print 2nd local as a C++ value
|
|
# $42 = ....
|
|
# (gdb) print *$42 # dereference $42, assuming it's a pointer (to a ScriptObject or String)
|
|
#
|
|
# Note that the gdb scripting language is rather limited.
|
|
#
|
|
|
|
define aswhere
|
|
set var $fcount = avmplus::AvmCore::getActiveCore()->debugger()->frameCount()
|
|
set var $i = 0
|
|
while ($i < $fcount)
|
|
# set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($k)
|
|
# call (void)avmplus::Debugger::printFrame($k)
|
|
asprintframe $i
|
|
set var $i = $i + 1
|
|
end
|
|
end
|
|
|
|
document aswhere
|
|
Print backtrace of all the ActionScript stack frames.
|
|
May not work in all contexts (notably inside MMgc).
|
|
May not work properly until gdb 'where' is called at least once.
|
|
end
|
|
|
|
set var $_asframe_selected=-1
|
|
|
|
define asprintframe
|
|
set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($arg0)
|
|
if ($frame == 0)
|
|
echo no frame\n
|
|
else
|
|
aspstring avmplus::Debugger::methodNameAt($frame)
|
|
echo (
|
|
set var $vcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT)
|
|
set var $j = 0
|
|
while ($j < $vcount)
|
|
set var $argname = avmplus::Debugger::autoVarName($frame, $j, avmplus::Debugger::AUTO_ARGUMENT)
|
|
aspstring $argname
|
|
echo =
|
|
set var $_atom = avmplus::Debugger::autoAtomAt($frame, $j, avmplus::Debugger::AUTO_ARGUMENT)
|
|
call (void)avmplus::Debugger::printAtom($_atom)
|
|
set var $j = $j + 1
|
|
if ($j != $vcount)
|
|
echo ,
|
|
end
|
|
end
|
|
echo )
|
|
echo \n
|
|
end
|
|
end
|
|
|
|
|
|
define asframe
|
|
if ($argc != 0)
|
|
set var $_asframe_selected=$arg0
|
|
end
|
|
if ($_asframe_selected >= 0)
|
|
asprintframe $_asframe_selected
|
|
else
|
|
echo no frame\n
|
|
end
|
|
end
|
|
|
|
document asframe
|
|
Select and print an ActionScript stack frame.
|
|
With no argument, print the selected AS stack frame.
|
|
An argument specifies the number of the stack frame to select.
|
|
end
|
|
|
|
|
|
define aspstring
|
|
call (void)avmplus::Debugger::printString($arg0)
|
|
end
|
|
|
|
document aspstring
|
|
Print the AS3 string.
|
|
end
|
|
|
|
# not pretty, but there's no switch
|
|
define aslocal
|
|
set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)
|
|
if ($frame == 0)
|
|
echo no frame\n
|
|
else
|
|
if $argc == 0
|
|
set var $lcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_LOCAL)
|
|
set var $k = 0
|
|
while ($k < $lcount)
|
|
set var $lname = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_LOCAL)
|
|
output $k
|
|
echo :\ \
|
|
aspstring $lname
|
|
echo :\ \
|
|
aslocal $k
|
|
set var $k = $k + 1
|
|
end
|
|
else
|
|
set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_LOCAL)
|
|
if ($_last_type == 0)
|
|
echo unknown\n
|
|
end
|
|
if ($_last_type == 1)
|
|
call avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_LOCAL)
|
|
end
|
|
if ($_last_type == 2)
|
|
call avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_LOCAL)
|
|
end
|
|
if ($_last_type == 3)
|
|
ecno namespace (unfinished)\n
|
|
end
|
|
if ($_last_type == 4)
|
|
echo undefined\n
|
|
end
|
|
if ($_last_type == 5)
|
|
call avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_LOCAL)
|
|
end
|
|
if ($_last_type == 6)
|
|
call avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_LOCAL)
|
|
end
|
|
if ($_last_type == 7)
|
|
call avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_LOCAL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
document aslocal
|
|
Print local variables of the currently selected AS stack frame, if debuging information present.
|
|
Information may be incorrect if not at a debugger safepoint.
|
|
With no argument, print all the local variables.
|
|
With a numeric argument print the specific local variable (gdb will store value in history
|
|
for further manipulation).
|
|
end
|
|
|
|
define asarg
|
|
set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)
|
|
if ($frame == 0)
|
|
echo no frame\n
|
|
else
|
|
if $argc == 0
|
|
set var $acount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT)
|
|
set var $k = 0
|
|
while ($k < $acount)
|
|
set var $name = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_ARGUMENT)
|
|
output $k
|
|
echo :\ \
|
|
aspstring $name
|
|
echo :\ \
|
|
asarg $k
|
|
set var $k = $k + 1
|
|
end
|
|
else
|
|
set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT)
|
|
if ($_last_type == 0)
|
|
echo unknown\n
|
|
end
|
|
if ($_last_type == 1)
|
|
print avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT)
|
|
end
|
|
if ($_last_type == 2)
|
|
print avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT)
|
|
end
|
|
if ($_last_type == 3)
|
|
echo namespace (unfinished)\n
|
|
end
|
|
if ($_last_type == 4)
|
|
echo undefined\n
|
|
end
|
|
if ($_last_type == 5)
|
|
print avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT)
|
|
end
|
|
if ($_last_type == 6)
|
|
print avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT)
|
|
end
|
|
if ($_last_type == 7)
|
|
print avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
document asarg
|
|
Print arguments of the currently selected AS stack frame.
|
|
If no debugging information is available, argument names will not be printed.
|
|
With no argument, print all the arguments.
|
|
With a numeric argument print the specific argument (gdb will store value in history
|
|
for further manipulation).
|
|
end
|
|
|
|
|
|
define asthis
|
|
set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)
|
|
if ($frame == 0)
|
|
echo no frame\n
|
|
else
|
|
print avmplus::Debugger::autoVarAsObject($frame, 0, avmplus::Debugger::AUTO_THIS)
|
|
end
|
|
end
|
|
|
|
document asthis
|
|
Print the receiver of the currently selected frame.
|
|
end
|
|
|
|
define asmixon
|
|
print avmshell::DebugCLI::debuggerInterruptOnEnter
|
|
print avmshell::DebugCLI::debuggerInterruptOnEnter = true
|
|
end
|
|
|
|
document asmixon
|
|
turn on stepping.
|
|
Execution will return to gdb propmpt after asstep* instructions.
|
|
Requires debugging symbols in .abcs
|
|
end
|
|
|
|
define asstepout
|
|
call avmplus::AvmCore::getActiveCore()->debugger()->stepOut()
|
|
continue
|
|
asprintframe 0
|
|
end
|
|
|
|
define asstepinto
|
|
output avmplus::AvmCore::getActiveCore()->debugger()->stepInto()
|
|
continue
|
|
asprintframe 0
|
|
end
|
|
|
|
define asstepover
|
|
output avmplus::AvmCore::getActiveCore()->debugger()->stepOver()
|
|
continue
|
|
asprintframe 0
|
|
end
|
|
|
|
|
|
define asprint
|
|
aspstring $arg0->traits()->name()
|
|
echo \n
|
|
end
|