GDB (API)
|
00001 # Tracepoint actions dialog for Insight. 00002 # Copyright (C) 1997, 1998, 1999, 2001 Red Hat, Inc. 00003 # 00004 # This program is free software; you can redistribute it and/or modify it 00005 # under the terms of the GNU General Public License (GPL) as published by 00006 # the Free Software Foundation; either version 2 of the License, or (at 00007 # your option) any later version. 00008 # 00009 # This program is distributed in the hope that it will be useful, 00010 # but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 # GNU General Public License for more details. 00013 00014 00015 itcl::class ActionDlg { 00016 inherit ManagedWin 00017 00018 # ------------------------------------------------------------------ 00019 # CONSTRUCTOR 00020 # ------------------------------------------------------------------ 00021 constructor {args} { 00022 global _TStepCount _TOtherVariable 00023 00024 eval itk_initialize $args 00025 00026 set Registers [gdb_reginfo name] 00027 if {$Line != ""} { 00028 set Locals [gdb_get_locals "$File:$Line"] 00029 set Args [gdb_get_args "$File:$Line"] 00030 } else { 00031 set Locals [gdb_get_locals "*$Address"] 00032 set Args [gdb_get_args "*$Address"] 00033 } 00034 set Variables [concat $Locals $Args] 00035 foreach a $Registers { 00036 lappend Variables "\$$a" 00037 } 00038 00039 if {[llength $Args] > 0} { 00040 lappend Variables "All Arguments" 00041 } 00042 if {[llength $Locals] > 0} { 00043 lappend Variables "All Locals" 00044 } 00045 lappend Variables "All Registers" 00046 lappend Variables "Collect Stack" 00047 00048 build_win 00049 00050 # Set a default return status, in case we are destroyed 00051 set _TOtherVariable {} 00052 00053 # Fill the listboxes with any default data 00054 if {"$Data" != {}} { 00055 change 1 $Data 00056 } 00057 } 00058 00059 # ------------------------------------------------------------------ 00060 # DESTRUCTOR - destroy window containing widget 00061 # ------------------------------------------------------------------ 00062 destructor { 00063 00064 # Remove this window and all hooks 00065 # grab release $this 00066 00067 # Note that this is okay: the callback (TraceDlg::done, usually) will 00068 # ignore stray "cancel" callbacks 00069 eval $Callback cancel 00070 } 00071 00072 # ------------------------------------------------------------------ 00073 # METHOD: build_win - build the Trace dialog box (cache this?) 00074 # ------------------------------------------------------------------ 00075 method build_win {} { 00076 global _TStepCount _TOtherVariable 00077 00078 set f $itk_interior 00079 00080 # The two frames of this dialog 00081 set bbox [frame $f.bbox]; # for holding OK,CANCEL buttons 00082 set data [frame $f.data]; # for everything else 00083 00084 # Setup the button box 00085 button $bbox.ok -text OK -command "$this ok" 00086 button $bbox.cancel -text CANCEL -command "$this cancel" 00087 pack $bbox.ok $bbox.cancel -side left -padx 10 -expand yes 00088 00089 # The "Data Collection" Frame 00090 set top [frame $data.top] 00091 set bot [frame $data.bot] 00092 00093 set boxes [frame $top.boxes] 00094 set cFrame [frame $boxes.cFrame] 00095 set vFrame [frame $boxes.vFrame] 00096 set bFrame [frame $boxes.bframe] 00097 set oFrame [frame $top.uFrame] 00098 pack $cFrame $bFrame $vFrame -side left -expand yes -padx 5 00099 00100 # While stepping 00101 if {$WhileStepping} { 00102 set step_frame [frame $top.stepf] 00103 label $step_frame.whilelbl -text {While Stepping, Steps:} 00104 set WhileSteppingEntry [entry $step_frame.steps \ 00105 -textvariable _TStepCount \ 00106 -width 5] 00107 pack $step_frame.whilelbl $WhileSteppingEntry -side left 00108 } 00109 00110 # The Collect listbox 00111 label $cFrame.lbl -text {Collect:} 00112 set CollectLB [iwidgets::scrolledlistbox $cFrame.lb -hscrollmode dynamic \ 00113 -vscrollmode dynamic \ 00114 -selectioncommand [code $this toggle_button_state 0] \ 00115 -dblclickcommand [code $this change 0] \ 00116 -selectmode extended \ 00117 -exportselection false] 00118 [$CollectLB component listbox] configure -background gray92 00119 pack $cFrame.lbl $cFrame.lb -side top -expand yes -pady 2 00120 00121 # The Variables listbox 00122 label $vFrame.lbl -text {Variables:} 00123 set VariablesLB [iwidgets::scrolledlistbox $vFrame.lb -hscrollmode dynamic \ 00124 -vscrollmode dynamic \ 00125 -selectioncommand [code $this toggle_button_state 1] \ 00126 -dblclickcommand [code $this change 1] \ 00127 -selectmode extended \ 00128 -exportselection false] 00129 [$VariablesLB component listbox] configure -background gray92 00130 pack $vFrame.lbl $vFrame.lb -side top -expand yes -pady 2 00131 00132 # The button frame 00133 set AddButton [button $bFrame.add -text {<<< Collect} \ 00134 -command "$this change 1" -state disabled] 00135 set RemoveButton [button $bFrame.del -text {Ignore >>>} \ 00136 -command "$this change 0" -state disabled] 00137 pack $bFrame.add $bFrame.del -side top -expand yes -pady 5 00138 00139 # The other frame (type-in) 00140 label $oFrame.lbl -text {Other:} 00141 set OtherEntry [entry $oFrame.ent -textvariable _TOtherVariable] 00142 pack $oFrame.lbl $OtherEntry -side left 00143 bind $OtherEntry <Return> "$this change_other" 00144 00145 # Pack these frames 00146 if {$WhileStepping} { 00147 pack $step_frame -side top 00148 } 00149 00150 pack $boxes $oFrame -side top -padx 5 -pady 5 00151 pack $top $bot -side top 00152 00153 # Fill the list boxes 00154 fill_listboxes 00155 00156 # Pack the main frames 00157 # after idle 00158 pack $f.data $bbox -side top -padx 4 -pady 2 \ 00159 -expand yes -fill x 00160 00161 # !!??? 00162 if {$WhileStepping} { 00163 $WhileSteppingEntry delete 0 end 00164 $WhileSteppingEntry insert 0 $Steps 00165 } 00166 } 00167 00168 method toggle_button_state {add} { 00169 00170 # This is invoked whenever a <1> event is generated in 00171 # the listbox... 00172 if {$add} { 00173 set a [$VariablesLB getcurselection] 00174 if {"$a" != ""} { 00175 $AddButton configure -state normal 00176 $RemoveButton configure -state disabled 00177 } 00178 } else { 00179 set a [$CollectLB getcurselection] 00180 if {"$a" != ""} { 00181 $AddButton configure -state disabled 00182 $RemoveButton configure -state normal 00183 } 00184 } 00185 } 00186 00187 00188 # ------------------------------------------------------------------ 00189 # METHOD: fill_listboxes - fills the two listboxes 00190 # ------------------------------------------------------------------ 00191 method fill_listboxes {{last {}}} { 00192 00193 # Fill the Collect listbox with the variables being collected 00194 if {[info exists Collect]} { 00195 fill_collect $last 00196 } 00197 00198 fill_variables $last 00199 } 00200 00201 # ------------------------------------------------------------------ 00202 # METHOD: change - change a selected variable 00203 # ------------------------------------------------------------------ 00204 method change {add {select {}}} { 00205 if {"$select" == {}} { 00206 set selections [get_selections $add] 00207 set lb [lindex $selections 0] 00208 set last [lindex $selections 1] 00209 set selection [lindex $selections 2] 00210 set noname 1 00211 } else { 00212 # This usually (only) occurs when we open this dialog for editing 00213 # some existing action. 00214 set lb {} 00215 set last {} 00216 set noname 0 00217 set selection $select 00218 } 00219 00220 $RemoveButton configure -state disabled 00221 $AddButton configure -state disabled 00222 00223 # Remove all the selections from one list 00224 # and add them to the other list 00225 if {$add} { 00226 set list1 $Variables 00227 set list2 $Collect 00228 } else { 00229 set list1 $Collect 00230 set list2 $Variables 00231 } 00232 00233 foreach a $selection { 00234 if {$noname} { 00235 set name [$lb get $a] 00236 } else { 00237 set name $a 00238 } 00239 00240 if {"$name" == "All Locals" || "$name" == {$loc}} { 00241 set name "All Locals" 00242 set lists [all_locals $add] 00243 set list1 [lindex $lists 0] 00244 set list2 [lindex $lists 1] 00245 } elseif {"$name" == "All Registers" || "$name" == {$reg}} { 00246 set name "All Registers" 00247 set lists [all_regs $add] 00248 set list1 [lindex $lists 0] 00249 set list2 [lindex $lists 1] 00250 } elseif {"$name" == "All Arguments" || "$name" == {$arg}} { 00251 set name "All Arguments" 00252 set lists [all_args $add] 00253 set list1 [lindex $lists 0] 00254 set list2 [lindex $lists 1] 00255 } else { 00256 set i [lsearch -exact $list1 $name] 00257 set list1 [lreplace $list1 $i $i] 00258 00259 # Check if this is something we want to keep on a list 00260 if {[lsearch $Args $name] != -1 || [lsearch $Registers [string trim $name \$]] != -1 || [lsearch $Locals $name] != -1 || $add} { 00261 lappend list2 $name 00262 } 00263 } 00264 00265 if {$add} { 00266 set Collect $list2 00267 set Variables $list1 00268 } else { 00269 set Collect $list1 00270 set Variables $list2 00271 } 00272 } 00273 00274 # Update boxes (!! SLOW !!) 00275 fill_collect $last 00276 fill_variables $last 00277 } 00278 00279 # ------------------------------------------------------------------ 00280 # METHOD: fill_collect - fill the collect box 00281 # ------------------------------------------------------------------ 00282 method fill_collect {{last {}}} { 00283 00284 $CollectLB delete 0 end 00285 set Collect [sort $Collect] 00286 foreach a $Collect { 00287 $CollectLB insert end $a 00288 } 00289 if {"$last" != ""} { 00290 $CollectLB see $last 00291 } 00292 } 00293 00294 # ------------------------------------------------------------------ 00295 # METHOD: fill_variables - fill the variables box 00296 # ------------------------------------------------------------------ 00297 method fill_variables {{last {}}} { 00298 00299 $VariablesLB delete 0 end 00300 set Variables [sort $Variables] 00301 foreach a $Variables { 00302 $VariablesLB insert end $a 00303 } 00304 00305 if {"$last" != ""} { 00306 $VariablesLB see $last 00307 } 00308 } 00309 00310 # ------------------------------------------------------------------ 00311 # METHOD: sort - sort a list of variables, placing regs and 00312 # special identifiers (like "All Locals") at end 00313 # ------------------------------------------------------------------ 00314 method sort {list} { 00315 00316 set special_names { 00317 "All Arguments" args \ 00318 "All Locals" locs \ 00319 "All Registers" regs \ 00320 "Collect Stack" stack 00321 } 00322 00323 foreach {name var} $special_names { 00324 set i [lsearch $list $name] 00325 if {$i != -1} { 00326 set $var 1 00327 set list [lreplace $list $i $i] 00328 } else { 00329 set $var 0 00330 } 00331 } 00332 00333 # Extract all the locals, regs, args, globals 00334 set types_list {Args Locals Registers } 00335 foreach type $types_list { 00336 set used_$type {} 00337 00338 foreach a [set $type] { 00339 set i [lsearch $list $a] 00340 if {$i != -1} { 00341 lappend used_$type $a 00342 set list [lreplace $list $i $i] 00343 } 00344 } 00345 set used_$type [lsort [set used_$type]] 00346 } 00347 00348 set globals [lsort $list] 00349 00350 # Sort the remaining list in order: args, locals, globals, regs 00351 set list [concat $used_Args $used_Locals $globals $used_Registers] 00352 00353 set list2 {} 00354 00355 foreach {name var} $special_names { 00356 if {[set $var]} { 00357 lappend list2 $name 00358 } 00359 } 00360 00361 set list [concat $list2 $list] 00362 return $list 00363 } 00364 00365 # ------------------------------------------------------------------ 00366 # METHOD: all_args - add/remove all args 00367 # ------------------------------------------------------------------ 00368 method all_args {add} { 00369 00370 if {$add} { 00371 set list1 $Variables 00372 set list2 $Collect 00373 } else { 00374 set list1 $Collect 00375 set list2 $Variables 00376 } 00377 00378 # foreach var $Args { 00379 # set i [lsearch $list1 $var] 00380 # if {$i != -1} { 00381 # set list1 [lreplace $list1 $i $i] 00382 # lappend list2 $var 00383 # } 00384 # } 00385 00386 lappend list2 "All Arguments" 00387 set i [lsearch $list1 "All Arguments"] 00388 if {$i != -1} { 00389 set list1 [lreplace $list1 $i $i] 00390 } 00391 00392 return [list $list1 $list2] 00393 } 00394 00395 # ------------------------------------------------------------------ 00396 # METHOD: all_locals - add/remove all locals 00397 # ------------------------------------------------------------------ 00398 method all_locals {add} { 00399 00400 if {$add} { 00401 set list1 $Variables 00402 set list2 $Collect 00403 } else { 00404 set list1 $Collect 00405 set list2 $Variables 00406 } 00407 00408 # foreach var $Locals { 00409 # set i [lsearch $list1 $var] 00410 # if {$i != -1} { 00411 # set list1 [lreplace $list1 $i $i] 00412 # lappend list2 $var 00413 # } 00414 # } 00415 00416 lappend list2 "All Locals" 00417 set i [lsearch $list1 "All Locals"] 00418 if {$i != -1} { 00419 set list1 [lreplace $list1 $i $i] 00420 } 00421 00422 return [list $list1 $list2] 00423 } 00424 00425 # ------------------------------------------------------------------ 00426 # METHOD: all_regs - add/remove all registers 00427 # ------------------------------------------------------------------ 00428 method all_regs {add} { 00429 00430 if {$add} { 00431 set list1 $Variables 00432 set list2 $Collect 00433 } else { 00434 set list1 $Collect 00435 set list2 $Variables 00436 } 00437 00438 # foreach var $Registers { 00439 # set i [lsearch $list1 "\$$var"] 00440 # if {$i != -1} { 00441 # set list1 [lreplace $list1 $i $i] 00442 # lappend list2 "\$$var" 00443 # } 00444 # } 00445 00446 lappend list2 "All Registers" 00447 set i [lsearch $list1 "All Registers"] 00448 if {$i != -1} { 00449 set list1 [lreplace $list1 $i $i] 00450 } 00451 00452 return [list $list1 $list2] 00453 } 00454 00455 # ------------------------------------------------------------------ 00456 # METHOD: change_other - add/remove a user defined type 00457 # ------------------------------------------------------------------ 00458 method change_other {} { 00459 set other [$OtherEntry get] 00460 00461 if {"$other" != ""} { 00462 set added 0 00463 00464 # Check if this is a local/register/arg 00465 set i [lsearch $Locals "$other"] 00466 if {$i != -1} { 00467 set i [lsearch $Collect "$other"] 00468 set added 1 00469 if {$i != -1} { 00470 # It's a local on the collection list 00471 debug "local on collection list" 00472 set add 0 00473 set list1 [lreplace $Collect $i $i] 00474 set list2 [concat $Variables "$other"] 00475 } else { 00476 # It's a local on the variables list 00477 debug "local on variable list" 00478 set add 1 00479 set i [lsearch $Variables "$other"] 00480 set list1 [lreplace $Variables $i $i] 00481 set list2 [concat $Collect "$other"] 00482 } 00483 } 00484 00485 set i [lsearch $Registers [string trim "$other" \$]] 00486 if {$i != -1} { 00487 set i [lsearch $Collect "$other"] 00488 set added 1 00489 if {$i != -1} { 00490 # It's a register on the collection list 00491 debug "register on collection list" 00492 set add 0 00493 set list1 [lreplace $Collect $i $i] 00494 set list2 [concat $Variables "$other"] 00495 } else { 00496 # It's a register on the variables list 00497 debug "register on variable list" 00498 set add 1 00499 set i [lsearch $Variables "$other"] 00500 set list1 [lreplace $Variables $i $i] 00501 set list2 [concat $Collect "$other"] 00502 } 00503 } 00504 00505 set i [lsearch $Args $other] 00506 if {$i != -1} { 00507 set i [lsearch $Collect "$other"] 00508 set added 1 00509 if {$i != -1} { 00510 # It's an arg on the collection list 00511 debug "arg on collection list" 00512 set add 0 00513 set list1 [lreplace $Collect $i $i] 00514 set list2 [concat $Variables "$other"] 00515 } else { 00516 # It's an arg on the variables list 00517 debug "arg on variable list" 00518 set add 1 00519 set i [lsearch $Variables "$other"] 00520 set list1 [lreplace $Variables $i $i] 00521 set list2 [concat $Collect "$other"] 00522 } 00523 } 00524 00525 # Check for special tags 00526 if {!$added} { 00527 if {"[string tolower $other]" == "all locals"} { 00528 set i [lsearch $Variables "All Locals"] 00529 if {$i != -1} { 00530 # It's "All Locals" on the variables list 00531 set add 1 00532 set lists [all_locals 1] 00533 set list1 [lindex $lists 0] 00534 set list2 [lindex $lists 1] 00535 } else { 00536 # It's "All Locals" on the Collect list 00537 set add 0 00538 set lists [all_locals 0] 00539 set list1 [lindex $lists 0] 00540 set list2 [lindex $lists 1] 00541 } 00542 } elseif {"[string tolower $other]" == "all registers"} { 00543 set i [lsearch $Variables "All Registers"] 00544 if {$i != -1} { 00545 # It's "All Registers" on the Variables list 00546 set add 1 00547 set lists [all_regs 1] 00548 set list1 [lindex $lists 0] 00549 set list2 [lindex $lists 1] 00550 } else { 00551 set add 0 00552 set lists [all_regs 0] 00553 set list1 [lindex $lists 0] 00554 set list2 [lindex $lists 1] 00555 } 00556 } elseif {"[string tolower $other]" == "all arguments"} { 00557 set i [lsearch $Variables "All Arguments"] 00558 if {$i != -1} { 00559 # It's "All Arguments" on the Variables list 00560 set add 1 00561 set lists [all_args 1] 00562 set list1 [lindex $lists 0] 00563 set list2 [lindex $lists 1] 00564 } else { 00565 set add 0 00566 set lists [all_args 0] 00567 set list1 [lindex $lists 0] 00568 set list2 [lindex $lists 1] 00569 } 00570 } elseif {"[string tolower $other]" == "collect stack"} { 00571 set i [lsearch $Variables "Collect Stack"] 00572 if {$i != -1} { 00573 # It's "All Arguments" on the Variables list 00574 set add 1 00575 set lists [all_args 1] 00576 set list1 [lindex $lists 0] 00577 set list2 [lindex $lists 1] 00578 } else { 00579 set add 0 00580 set lists [all_args 0] 00581 set list1 [lindex $lists 0] 00582 set list2 [lindex $lists 1] 00583 } 00584 } else { 00585 # Check if this entry is on the Collect list 00586 set i [lsearch $Collect $other] 00587 if {$i != -1} { 00588 # It's on the list -- remove it 00589 set add 0 00590 set list1 [lreplace $Collect $i $i] 00591 set list2 $Variables 00592 } else { 00593 # It's not on the list -- add it 00594 00595 set other [string trim $other \ \r\t\n] 00596 00597 # accept everything, send to gdb to validate 00598 set ok 1 00599 00600 # memranges will be rejected right here 00601 00602 if {[string range $other 0 1] == "\$("} { 00603 tk_messageBox -type ok -icon error \ 00604 -message "Expression syntax not supported" 00605 set ok 0 00606 } 00607 00608 # do all syntax checking later 00609 if {$ok} { 00610 #debug "Keeping \"$other\"" 00611 # We MUST string out all spaces... 00612 if {[regsub -all { } $other {} expression]} { 00613 set other $expression 00614 } 00615 set add 1 00616 set list1 $Variables 00617 set list2 [concat $Collect "$other"] 00618 } else { 00619 #debug "Discarding \"$other\"" 00620 } 00621 } 00622 } 00623 } 00624 00625 # Clear the entry 00626 $OtherEntry delete 0 end 00627 00628 if {$add} { 00629 set Variables $list1 00630 set Collect $list2 00631 } else { 00632 set Variables $list2 00633 set Collect $list1 00634 } 00635 fill_listboxes 00636 } 00637 } 00638 00639 00640 # ------------------------------------------------------------------ 00641 # METHOD: get_selections - get all the selected variables 00642 # pass 0 to get the selections from the collect box 00643 # Returns a list of: listbox in which the selections were 00644 # obtained, last element selected on the list, and all the 00645 # selected elements 00646 # ------------------------------------------------------------------ 00647 method get_selections {vars} { 00648 00649 if {$vars} { 00650 set widget $VariablesLB 00651 } else { 00652 set widget $CollectLB 00653 } 00654 00655 set elements [$widget curselection] 00656 set list {} 00657 set i 0 00658 foreach i $elements { 00659 lappend list [$widget get $i] 00660 } 00661 00662 return [list $widget $i $elements] 00663 } 00664 00665 # ------------------------------------------------------------------ 00666 # METHOD: cancel - cancel the dialog and do not set the trace 00667 # ------------------------------------------------------------------ 00668 method cancel {} { 00669 ::delete object $this 00670 } 00671 00672 method remove_special {list items} { 00673 00674 foreach item $items { 00675 set i [lsearch $list $item] 00676 if {$i != -1} { 00677 set list [lreplace $list $i $i] 00678 } else { 00679 set i [lsearch $list \$$item] 00680 if {$i != -1} { 00681 set list [lreplace $list $i $i] 00682 } 00683 } 00684 } 00685 00686 return $list 00687 } 00688 00689 # ------------------------------------------------------------------ 00690 # METHOD: ok - validate the tracepoint and install it 00691 # ------------------------------------------------------------------ 00692 method ok {} { 00693 global _TStepCount 00694 00695 # Add anything in the OtherEntry 00696 change_other 00697 00698 # Check that we are collecting data 00699 if {[llength $Collect] == 0} { 00700 # No data! 00701 set msg "No data specified for the given action." 00702 set answer [tk_messageBox -type ok -title "Tracepoint Error" \ 00703 -icon error \ 00704 -message $msg] 00705 case $answer { 00706 cancel { 00707 cancel 00708 } 00709 ok { 00710 return 00711 } 00712 } 00713 } 00714 00715 set i [lsearch $Collect "All Locals"] 00716 if {$i != -1} { 00717 set data [lreplace $Collect $i $i] 00718 set data [concat $data {$loc}] 00719 00720 # Remove all the locals from the list 00721 set data [remove_special $data $Locals] 00722 } else { 00723 set data $Collect 00724 } 00725 00726 set i [lsearch $data "All Registers"] 00727 if {$i != -1} { 00728 set data [lreplace $data $i $i] 00729 set data [concat $data {$reg}] 00730 00731 # Remove all the locals from the list 00732 set data [remove_special $data $Registers] 00733 } 00734 00735 set i [lsearch $data "All Arguments"] 00736 if {$i != -1} { 00737 set data [lreplace $data $i $i] 00738 set data [concat $data {$arg}] 00739 00740 # Remove all the locals from the list 00741 set data [remove_special $data $Args] 00742 } 00743 00744 set i [lsearch $data "Collect Stack"] 00745 if {$i != -1} { 00746 set data [lreplace $data $i $i] 00747 set data [concat $data [collect_stack]] 00748 00749 } 00750 00751 # Remove repeats 00752 set d {} 00753 foreach i $data { 00754 if {![info exists check($i)]} { 00755 set check($i) 1 00756 lappend d $i 00757 } 00758 } 00759 00760 if {$WhileStepping} { 00761 set steps $_TStepCount 00762 } else { 00763 set steps 0 00764 } 00765 00766 if {"$Data" != {}} { 00767 set command "modify" 00768 } else { 00769 set command "add" 00770 } 00771 00772 debug "DATA = $data" 00773 eval $Callback $command $steps [list $data] 00774 ::delete object $this 00775 } 00776 00777 00778 method collect_stack {} { 00779 return $StackCollect 00780 } 00781 00782 method cmd {line} { 00783 $line 00784 } 00785 00786 # PUBLIC DATA 00787 public variable File 00788 public variable Line {} 00789 public variable WhileStepping 0 00790 public variable Number 00791 public variable Callback 00792 public variable Data {} 00793 public variable Steps {} 00794 public variable Address {} 00795 00796 # PROTECTED DATA 00797 protected variable WhileSteppingEntry 00798 protected variable CollectLB 00799 protected variable VariablesLB 00800 protected variable Variables {} 00801 protected variable Collect {} 00802 protected variable Locals 00803 protected variable Args 00804 protected variable Registers 00805 protected variable Others {} 00806 protected variable AddButton 00807 protected variable RemoveButton 00808 protected variable OtherEntry 00809 protected variable StackCollect {*(char*)$sp@64} 00810 }