make sure directory exists..
[AROS.git] / _gdbinit
blobbd9e5904ce5ba997b6e62e856c5a075649508e91
1 handle SIGUSR1 pass noprint nostop
2 handle SIGUSR2 pass noprint nostop
4 define liblist
5     set $lib = SysBase->LibList.lh_Head
7     printf "Base     OpenC   Name\n"
8     printf "---------------------------------------------------------------\n"
9     while ($lib->ln_Succ != 0)
10         printf "%p %5d   %s\n", \
11             $lib, \
12             ((struct Library *)$lib)->lib_OpenCnt, \
13             $lib->ln_Name
14         set $lib = $lib->ln_Succ
15     end
16 end
17 document liblist
18 List the current libraries in the system
19 end
21 define devlist
22     set $dev = SysBase->DeviceList.lh_Head
23     printf "Base     OpenC   Name\n"
24     printf "---------------------------------------------------------------\n"
25     while ($dev->ln_Succ != 0)
26         printf "%p %5d   %s\n", \
27             $dev, \
28             ((struct Library *)$dev)->lib_OpenCnt, \
29             $dev->ln_Name
30         set $dev = $dev->ln_Succ
31     end
32 end
33 document devlist
34 List the current devices in the system
35 end
37 define resourcelist
38     set $res = SysBase->ResourceList.lh_Head
39     printf "Base     Name\n"
40     printf "---------------------------------------------------------------\n"
41     while ($res->ln_Succ != 0)
42         printf "%p %s\n", $res, $res->ln_Name
43         set $res = $res->ln_Succ
44     end
45 end
46 document resourcelist
47 List the current resources in the system
48 end
50 define residentlist
51     set $resp = (struct Resident **)SysBase->ResModules
52     set $i = 0
54     printf "Address    Pri Flags Vers Type  Name\n"
55     printf "--------------------------------------------------------------\n"
56     while (($resp)[$i] != 0)
57         set $res = ($resp)[$i]
58         printf "%p  %4d    %02x  %3d  %3d  %s\n", \
59             $res, \
60             ((struct Resident *)$res)->rt_Pri, \
61             ((struct Resident *)$res)->rt_Flags, \
62             ((struct Resident *)$res)->rt_Version, \
63             ((struct Resident *)$res)->rt_Type, \
64             ((struct Resident *)$res)->rt_Name
65         set $i = $i + 1
66     end
67 end
68 document residentlist
69 List the system resident list
70 end
72 define taskready
73     set $task = (struct Task *)SysBase->TaskReady.lh_Head
75     printf "Task     SigWait  SigRecvd StkSize   StkUsed Pri Type Name\n"
76     printf "-----------------------------------------------------------------------------\n"
77     while ($task->tc_Node.ln_Succ != 0)
78         printf "%p %p %p %8d %8d %3d  %3ld %s\n", \
79             $task, \
80             $task->tc_SigWait, \
81             $task->tc_SigRecvd, \
82             $task->tc_SPUpper - $task->tc_SPLower, \
83             $task->tc_SPUpper - $task->tc_SPReg, \
84             $task->tc_Node.ln_Pri, \
85             $task->tc_Node.ln_Type, \
86             $task->tc_Node.ln_Name
87         set $task = (struct Task *)$task->tc_Node.ln_Succ
88     end
89 end
90 document taskready
91 List of tasks currently ready to run
92 end
94 define taskwait
95     set $task = (struct Task *)SysBase->TaskWait.lh_Head
97     printf "Task     SigWait  SigRecvd StkSize   StkUsed Pri Type Name\n"
98     printf "-----------------------------------------------------------------------------\n"
99     while ($task->tc_Node.ln_Succ != 0)
100         printf "%p %p %p %8d %8d %3d  %3ld %s\n", \
101             $task, \
102             $task->tc_SigWait, \
103             $task->tc_SigRecvd, \
104             $task->tc_SPUpper - $task->tc_SPLower, \
105             $task->tc_SPUpper - $task->tc_SPReg, \
106             $task->tc_Node.ln_Pri, \
107             $task->tc_Node.ln_Type, \
108             $task->tc_Node.ln_Name
109         set $task = (struct Task *)$task->tc_Node.ln_Succ
110     end
112 document taskwait
113 List of tasks currently waiting for an event
116 define thistask
117     set $task = (struct Task *)SysBase->ThisTask
118     printf "Task     SigWait  SigRecvd StkSize   StkUsed Pri Type Name\n"
119     printf "-----------------------------------------------------------------------------\n"
120     printf "%p %p %p %8d %8d %3d  %3ld %s\n", \
121         $task, \
122         $task->tc_SigWait, \
123         $task->tc_SigRecvd, \
124         $task->tc_SPUpper - $task->tc_SPLower, \
125         $task->tc_SPUpper - $task->tc_SPReg, \
126         $task->tc_Node.ln_Pri, \
127         $task->tc_Node.ln_Type, \
128         $task->tc_Node.ln_Name
130 document thistask
131 Print out information about the currently running task.
134 define modlist
135     printf "Segment           Module\n"
137     if Debug_ModList
138         printf "---------------------------------------------------------------------\n"
139         set $segnode = (struct segment *)Debug_ModList->mlh_Head
141         while ($segnode->s_node.mln_Succ != 0)
142             printf "%p %12s %2u %32s\n", $segnode->s_lowest, $segnode->s_name, $segnode->s_num, $segnode->s_mod->mod.m_name
144             set $segnode = (struct segment *)$segnode->s_node.mln_Succ
145         end
146     end
148     printf "---------------------------------------------------------------------\n"
149     set $kicknode = Debug_KickList
150         
151     while ($kicknode != 0)
152         printf "%p %12s %2u %32s\n", $kicknode->s_lowest, $kicknode->s_name, $kicknode->s_num, $kicknode->s_module.m_name
154         set $kicknode = $kicknode->s_next
155     end
157 document modlist
158 List of all the modules currently loaded in memory
161 define findaddr
162     set $cont = 1
164     #first search in modules loaded from disk
165     printf "Searching in the loaded modules...\n"
166     if Debug_ModList
167         set $segnode = (struct segment *)Debug_ModList->mlh_Head
169         while ($segnode->s_node.mln_Succ != 0) && $cont
170             if $arg0 >= $segnode->s_lowest && $arg0 <= $segnode->s_highest
171                 printf "Address found in %s, in segment %p.\nIf this is an executable, its .text section starts at %p.\n", $segnode->s_mod->mod.m_name, $segnode->s_seg, $segnode->s_lowest
173                 set $cont = 0
174             end
175             set $segnode = (struct segment *)$segnode->s_node.mln_Succ
176         end
177     end
179     if $cont
180         printf "Searching in the kickstart list...\n"
181         set $kicknode = Debug_KickList
182         
183         while ($kicknode != 0) && $cont
185             if $arg0 >= $kicknode->s_lowest && $arg0 <= $kicknode->s_highest
186                 printf "Address found in %s.\nIf this is an executable, its .text section starts at %p.\n", $kicknode->s_module.m_name, $kicknode->s_lowest
188                 set $cont = 0
189             end
190             set $kicknode = $kicknode->s_next
191         end
192     end
194     #then in the resident list
195     if $cont
196         printf "Searching in the resident list...\n"
197     end
199     set $resp = (struct Resident **)SysBase->ResModules
200     set $i = 0
202     while (($resp)[$i] != 0) && $cont
203         set $res = ($resp)[$i]
205         if ($arg0 >= $res) && ($arg0 <= $res->rt_EndSkip)
206             printf "Address found in %s, which resides at %p\n", $res->rt_Name, $res
207             set $cont = 0
208         end
210         set $i = $i + 1
211     end
213     if $cont
214         printf "No matching module for this address\n"
215     end
217 document findaddr
218 -Shows the module that contains the given address
220 -To debug a problem in AROS, do the following:
222 -1. Get a stacktrace with bt or similar.
223 -2. Use findaddr with such an address to find out in which
224 -   module it is:
225 -3. Use add-symbol-file to load that modules symbols.
226 -4. Now you can run bt (or similar) again and you should see the
227 -   addresses resolved as symbols.
229 -Example:
231 -0x4058d45b in ?? ()
233 -(gdb) findaddr 0x4058d45b
235 -Searching in the loaded modules...
236 -Address found in Workbench:contrib/Zune/Libs/muimaster.library, which is loaded at 0x405379a4.
237 -If this is an executable, its .text section starts at 0x405379b0.
238 -(gdb) add-symbol-file contrib/Zune/Libs/muimaster.library 0x405379b0
239 -add symbol table from file "contrib/Zune/Libs/muimaster.library" at
240 -        .text_addr = 0x405379b0
241 -(y or n) y
242 -Reading symbols from contrib/Zune/Libs/muimaster.library...done.
243 -(gdb) bt
244 -#0  0x4058d45b in strlen (ptr=0x80 <Address 0x80 out of bounds>) at strlen.c:45
245 -#1  0x00000000 in lastx.78 ()
248 define printtaglist
249     set $list = (struct TagItem *)$arg0
251     printf "Tag         Data (Hex)     Data (Dec)\n"
252     printf "--------------------------------------\n"
254     while $list->ti_Tag != 0
255         # Handle the possible control tag...
256         if $list->ti_Tag == 1
257             printf "TAG_IGNORE\n"
258         else if $list->ti_Tag == 2
259             printf "TAG_MORE    %p\n", $list->ti_Data
260             set $list = (struct TagItem *)$list->ti_Data
261         else if $list->ti_Tag == 3
262             printf "TAG_SKIP    %d\n", $list->ti_Data
263             set $list = $list + $list->ti_Tag + 1
264         else
265             printf "%p  %p      %9lu\n", $list->ti_Tag, $list->ti_Data, $list->ti_Data
266             set $list = $list + 1
267         end
268     end
269     printf "TAG_DONE\n"
271 document printtaglist
273     
274 define log_to_file
275   set logging file $arg0
276   set logging redirect on
277   set logging overwrite $arg1
278   set logging on
281 define end_log
282   set logging off
285 define loadseg
286   dont-repeat
287   if Debug_ModList
288   set $step = 1
289   set $segnode = (struct segment *)Debug_ModList->mlh_Head
290   while ($segnode->s_node.mln_Succ != 0) && $step == 1
291     if $arg0 >= $segnode->s_lowest && $arg0 <= $segnode->s_highest
292       log_to_file segname.tmp on
293       printf "%s", $segnode->s_mod->mod.m_name
294       end_log
295       shell sed -i 's/.*:\(.*\)/\1/' segname.tmp
296       log_to_file loadseg.tmp on
297       printf "add-symbol-file "
298       end_log
299       shell head -n1 segname.tmp >>loadseg.tmp
300       log_to_file loadseg.tmp off
301       printf " %p", $segnode->s_lowest
302       if $segnode->s_node.mln_Succ != 0
303         set $segnode = (struct segment *)$segnode->s_node.mln_Succ
304         while ($segnode->s_node.mln_Succ != 0) && $step < 5
305           if strcmp($segnode->s_name, ".text") == 0
306             loop_break
307           end
308           printf " -s %s %p", $segnode->s_name, $segnode->s_lowest
309           set $step = $step + 1
310           set $segnode = (struct segment *)$segnode->s_node.mln_Succ
311         end
312       end
313       end_log
314       source loadseg.tmp
315       loop_break
316     end
317     set $segnode = (struct segment *)$segnode->s_node.mln_Succ
318   end
319   if $step < 2
320     set $kicknode = Debug_KickList
321         
322     while ($kicknode != 0) && $step == 1
323       if $arg0 >= $kicknode->s_lowest && $arg0 <= $kicknode->s_highest
324         log_to_file segname.tmp on
325         printf "%s", $kicknode->s_module.m_name
326         end_log
327         shell sed -i 's/.*:\(.*\)/\1/' segname.tmp
328         log_to_file loadseg.tmp on
329         printf "add-symbol-file "
330         end_log
331         shell head -n1 segname.tmp >>loadseg.tmp
332         log_to_file loadseg.tmp off
333         printf " %p", $kicknode->s_lowest
334         if $kicknode->s_next != 0
335           set $kicknode = $kicknode->s_next
336           while ($kicknode != 0) && $step < 5
337             if strcmp($kicknode->s_name, ".text") == 0
338               loop_break
339             end
340             printf " -s %s %p", $kicknode->s_name, $kicknode->s_lowest
341             set $step = $step + 1
342             set $kicknode = $kicknode->s_next
343           end
344         end
345         end_log
346         source loadseg.tmp
347         loop_break
348       end
349       set $kicknode = $kicknode->s_next
350     end
351   end
352   if $step < 2
353     printf "no matching module for this address\n"
354   end
355   else
356     printf "no debug symbols found\n"
357   end
359 document loadseg
360 Loads the module that contains the given address
363 define seglistdump
364     set $nextseg = $arg0
365     set $count   = 1
367     printf "Hunk num. | Start addr | Size       \n"
368     printf "----------+------------+------------\n"
369     while $nextseg
370         printf "%9d | %p | %10d\n", $count, $nextseg + sizeof(BPTR), *((ULONG *)$nextseg - 1) - sizeof(BPTR)
372         set $nextseg = *(BPTR *)$nextseg
373         set $count = $count+1
374     end
376 document seglistdump
377 Shows the segments chain of the given seglist