AmberRAM: FreeMem() *after* it's no longer used!
[AROS.git] / _gdbinit
blobd0e9c3583fc72544773f494b599feceddf12d00d
1 handle SIGUSR1 pass noprint nostop
2 handle SIGUSR2 pass noprint nostop
4 define liblist
5     set $lib = ((struct ExecBase *)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 = ((struct ExecBase *)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 = ((struct ExecBase *)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 **)((struct ExecBase *)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 *)((struct ExecBase *)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 *)((struct ExecBase *)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 *)((struct ExecBase *)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->m_name
144             set $segnode = (struct segment *)$segnode->s_node.mln_Succ
145         end
146     end
148     printf "---------------------------------------------------------------------\n"
149     set $kicknode = Debug_KickList
151     while ($kicknode != 0)
152         set $eh = $kicknode->eh
153         set $sh = $kicknode->sh
154         set $shnum = $eh->shnum
156         set $i = 0
157         while ($i < $shnum)
158             if ($sh->addr != 0) && ($sh->size != 0)
159                 printf "%p %12s %2u %32s\n", $sh->addr, $i, $kicknode->Name
160             end
161             $sh++
162             $i++
163         end
164         set $kicknode = $kicknode->Next
165     end
167 document modlist
168 List of all the modules currently loaded in memory
171 define findaddr
172     set $cont = 1
174     #first search in modules loaded from disk
175     printf "Searching in the loaded modules...\n"
176     if Debug_ModList
177         set $segnode = (struct segment *)Debug_ModList->mlh_Head
179         while ($segnode->s_node.mln_Succ != 0) && $cont
180             if $arg0 >= $segnode->s_lowest && $arg0 <= $segnode->s_highest
181                 printf "Address found in %s, in segment %p.\nIf this is an executable, its .text section starts at %p.\n", $segnode->s_mod->m_name, $segnode->s_seg, $segnode->s_lowest
183                 set $cont = 0
184             end
185             set $segnode = (struct segment *)$segnode->s_node.mln_Succ
186         end
187     end
189     if $cont
190         printf "Searching in the kickstart list...\n"
191         set $kicknode = Debug_KickList
193         while ($kicknode != 0) && $cont
194             set $eh = $kicknode->eh
195             set $sh = $kicknode->sh
196             set $shnum = $eh->shnum
198             set $i = 0
199             while ($i < $shnum) && $cont
200                 if ($sh->addr != 0) && ($sh->size != 0)
201                     set $lowest  = $sh->addr
202                     set $highest = $sh->addr + $sh->size - 1
204                     if $arg0 >= $lowest && $arg0 <= $highest
205                         printf "Address found in %s in section number %d starting at %p.\n", $kicknode->Name, $i, $lowest
206                         set $cont = 0
207                     end
208                 end
210                 set $sh = $sh + 1
211                 set $i = $i + 1
212             end
213             set $kicknode = $kicknode->Next
214         end
215     end
217     #then in the resident list
218     if $cont
219         printf "Searching in the resident list...\n"
220     end
222     set $resp = (struct Resident **)((struct ExecBase *)SysBase)->ResModules
223     set $i = 0
225     while (($resp)[$i] != 0) && $cont
226         set $res = ($resp)[$i]
228         if ($arg0 >= $res) && ($arg0 <= $res->rt_EndSkip)
229             printf "Address found in %s, which resides at %p\n", $res->rt_Name, $res
230             set $cont = 0
231         end
233         set $i = $i + 1
234     end
236     if $cont
237         printf "No matching module for this address\n"
238     end
240 document findaddr
241 -Shows the module that contains the given address
243 -To debug a problem in AROS, do the following:
245 -1. Get a stacktrace with bt or similar.
246 -2. Use findaddr with such an address to find out in which
247 -   module it is:
248 -3. Use add-symbol-file to load that modules symbols.
249 -4. Now you can run bt (or similar) again and you should see the
250 -   addresses resolved as symbols.
252 -Example:
254 -0x4058d45b in ?? ()
256 -(gdb) findaddr 0x4058d45b
258 -Searching in the loaded modules...
259 -Address found in Workbench:contrib/Zune/Libs/muimaster.library, which is loaded at 0x405379a4.
260 -If this is an executable, its .text section starts at 0x405379b0.
261 -(gdb) add-symbol-file contrib/Zune/Libs/muimaster.library 0x405379b0
262 -add symbol table from file "contrib/Zune/Libs/muimaster.library" at
263 -        .text_addr = 0x405379b0
264 -(y or n) y
265 -Reading symbols from contrib/Zune/Libs/muimaster.library...done.
266 -(gdb) bt
267 -#0  0x4058d45b in strlen (ptr=0x80 <Address 0x80 out of bounds>) at strlen.c:45
268 -#1  0x00000000 in lastx.78 ()
271 define printtaglist
272     set $list = (struct TagItem *)$arg0
274     printf "Tag         Data (Hex)     Data (Dec)\n"
275     printf "--------------------------------------\n"
277     while $list->ti_Tag != 0
278         # Handle the possible control tag...
279         if $list->ti_Tag == 1
280             printf "TAG_IGNORE\n"
281         else if $list->ti_Tag == 2
282             printf "TAG_MORE    %p\n", $list->ti_Data
283             set $list = (struct TagItem *)$list->ti_Data
284         else if $list->ti_Tag == 3
285             printf "TAG_SKIP    %d\n", $list->ti_Data
286             set $list = $list + $list->ti_Tag + 1
287         else
288             printf "%p  %p      %9lu\n", $list->ti_Tag, $list->ti_Data, $list->ti_Data
289             set $list = $list + 1
290         end
291     end
292     printf "TAG_DONE\n"
294 document printtaglist
297 define log_to_file
298   set logging file $arg0
299   set logging redirect on
300   set logging overwrite $arg1
301   set logging on
304 define end_log
305   set logging off
308 define loadseg
309   dont-repeat
310   if Debug_ModList
311   set $step = 1
312   set $segnode = (struct segment *)Debug_ModList->mlh_Head
313   while ($segnode->s_node.mln_Succ != 0) && $step == 1
314     if $arg0 >= $segnode->s_lowest && $arg0 <= $segnode->s_highest
315       log_to_file segname.tmp on
316       printf "%s", $segnode->s_mod->m_name
317       end_log
318       shell sed -i 's/.*:\(.*\)/\1/' segname.tmp
319       log_to_file loadseg.tmp on
320       printf "add-symbol-file "
321       end_log
322       shell head -n1 segname.tmp >>loadseg.tmp
323       log_to_file loadseg.tmp off
324       printf " %p", $segnode->s_lowest
325       if $segnode->s_node.mln_Succ != 0
326         set $segnode = (struct segment *)$segnode->s_node.mln_Succ
327         while ($segnode->s_node.mln_Succ != 0) && $step < 5
328           if strcmp($segnode->s_name, ".text") == 0
329             loop_break
330           end
331           printf " -s %s %p", $segnode->s_name, $segnode->s_lowest
332           set $step = $step + 1
333           set $segnode = (struct segment *)$segnode->s_node.mln_Succ
334         end
335       end
336       end_log
337       source loadseg.tmp
338       loop_break
339     end
340     set $segnode = (struct segment *)$segnode->s_node.mln_Succ
341   end
342   if $step < 2
343     set $kicknode = Debug_KickList
345     while ($kicknode != 0) && $step == 1
346         set $eh = $kicknode->eh
347         set $sh = $kicknode->sh
348         set $shnum = $eh->shnum
350         set $i = 0
351         while ($i < $shnum) && $cont
352             if ($sh->addr != 0) && ($sh->size != 0)
353                 set $lowest  = $sh->addr
354                 set $highest = $sh->addr + $sh->size - 1
356                 if $arg0 >= $lowest && $arg0 <= $highest
357                 
358                     set $shstrndx = $eh->shstrndx
359                     set $shstr = 0
361                     if ($shstrndx < 0xFF00)
362                         set $shstr = $shstrndx
363                     if ($shstrndx > 0xFFFF)
364                         set $shstr = $shstrndx - (0x10000 - 0xFF00)
366                     log_to_file segname.tmp on
367                     printf "%s", $kicknode->s_module.m_name
368                     end_log
369                     shell sed -i 's/.*:\(.*\)/\1/' segname.tmp
370                     log_to_file loadseg.tmp on
371                     printf "add-symbol-file "
372                     end_log
373                     shell head -n1 segname.tmp >>loadseg.tmp
374                     log_to_file loadseg.tmp off
375                     printf " %p", $s_lowest
377                     set $sh = $sh + 1
378                     set $i = $i + 1
379                     while ($i < $shnum)
380                         if ($sh->addr != 0) && ($sh->size != 0)
381                             set $segname = $kicknode->sh[$shstr] + $sh->name
382                             printf " -s %s %p", $segname, $sh->addr
383                         end
384                         set $step = $step + 1
385                     end
387                     end_log
388                     source loadseg.tmp
389                     loop_break
390                 end
391             end
393             set $sh = $sh + 1
394             set $i = $i + 1
395         end
396         set $kicknode = $kicknode->Next
397     end
398   end
399   if $step < 2
400     printf "no matching module for this address\n"
401   else
402     printf "no debug symbols found\n"
403   end
405 document loadseg
406 Loads the module that contains the given address
409 define seglistdump
410     set $nextseg = $arg0
411     set $count   = 1
413     printf "Hunk num. | Start addr | Size       \n"
414     printf "----------+------------+------------\n"
415     while $nextseg
416         printf "%9d | %p | %10d\n", $count, $nextseg + sizeof(BPTR), *((ULONG *)$nextseg - 1) - sizeof(BPTR)
418         set $nextseg = *(BPTR *)$nextseg
419         set $count = $count+1
420     end
422 document seglistdump
423 Shows the segments chain of the given seglist