mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +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
 |