Skip to content

Commit

Permalink
Support for GDB
Browse files Browse the repository at this point in the history
  • Loading branch information
pchaigno committed Jul 14, 2016
1 parent 36ba378 commit 1d48ff5
Show file tree
Hide file tree
Showing 7 changed files with 317 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -752,3 +752,6 @@ url = https://github.com/austinwagner/sublime-sourcepawn
[submodule "vendor/grammars/language-blade"]
path = vendor/grammars/language-blade
url = https://github.com/jawee/language-blade
[submodule "vendor/grammars/SublimeGDB"]
path = vendor/grammars/SublimeGDB
url = https://github.com/quarnster/SublimeGDB
5 changes: 5 additions & 0 deletions grammars.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ vendor/grammars/SublimeBrainfuck:
- source.bf
vendor/grammars/SublimeClarion/:
- source.clarion
vendor/grammars/SublimeGDB/:
- source.disasm
- source.gdb
- source.gdb.session
- source.gdbregs
vendor/grammars/SublimePapyrus/:
- source.papyrus.skyrim
vendor/grammars/SublimePuppet/:
Expand Down
8 changes: 8 additions & 0 deletions lib/linguist/languages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1207,6 +1207,14 @@ GCC Machine Description:
tm_scope: source.lisp
ace_mode: lisp

GDB:
type: programming
extensions:
- .gdb
- .gdbinit
tm_scope: source.gdb
ace_mode: text

GDScript:
type: programming
extensions:
Expand Down
259 changes: 259 additions & 0 deletions samples/GDB/as3.gdbinit
Original file line number Diff line number Diff line change
@@ -0,0 +1,259 @@
# -*- 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
36 changes: 36 additions & 0 deletions samples/GDB/gdb_lpc17xx_program.gdb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#
# MicropendousX LPC17xx Development Board
#
# http://www.MicropendousX.org
#
# Connect to a debugger controlling a LPC17xx
# and download firmware.
#
# Start your OpenOCD gdb server before running
# this script with: arm-none-eabi-gdb -x gdb_lpc17xx_program.gdb
#
# Note the 'monitor' command just passes its
# arguments to OpenOCD
#
# This file is released under the MIT License
#

# Connect to OpenOCD gdb server
target remote localhost:3333

# reset the LPC17xx IC with the OpenOCD reset command
monitor reset

# the following are OpenOCD commands as in OpenOCD_program.script
# which will download a hex file into your LPC17xx
monitor halt
monitor sleep 200
monitor wait_halt
monitor flash probe 0
monitor flash info 0
monitor flash write_image erase unlock USBtoSerial.hex
monitor sleep 200
monitor reset run
monitor exit

quit
1 change: 1 addition & 0 deletions vendor/grammars/SublimeGDB
Submodule SublimeGDB added at 0afb64
5 changes: 5 additions & 0 deletions vendor/licenses/grammar/SublimeGDB.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
type: grammar
name: SublimeGDB
license: other
---

0 comments on commit 1d48ff5

Please sign in to comment.