Welcome to eurozone!
[AROS.git] / _gdbinit
blob1e6c3de7a549b30790d7c3b85b3db77e24f17f3e
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       printf "%s", $segnode->s_mod->mod.m_name
293       log_to_file segname.tmp on
294       printf "%s", $segnode->s_mod->mod.m_name
295       end_log
296       shell sed -i 's/.*:\(.*\)/\1/' segname.tmp
297       log_to_file loadseg.tmp on
298       printf "add-symbol-file "
299       end_log
300       shell head -n1 segname.tmp >>loadseg.tmp
301       log_to_file loadseg.tmp off
302       printf " %p", $segnode->s_lowest
303       if $segnode->s_node.mln_Succ != 0
304         set $segnode = (struct segment *)$segnode->s_node.mln_Succ
305         while ($segnode->s_node.mln_Succ != 0) && $step < 5
306           if strcmp($segnode->s_name, ".text") == 0
307             loop_break
308           end
309           printf " -s %s %p", $segnode->s_name, $segnode->s_lowest
310           set $step = $step + 1
311           set $segnode = (struct segment *)$segnode->s_node.mln_Succ
312         end
313       end
314       end_log
315       source loadseg.tmp
316       loop_break
317     end
318     set $segnode = (struct segment *)$segnode->s_node.mln_Succ
319   end
320   if $step < 2
321     set $kicknode = Debug_KickList
322         
323     while ($kicknode != 0) && $step == 1
324       if $arg0 >= $kicknode->s_lowest && $arg0 <= $kicknode->s_highest
325         printf "%s", $kicknode->s_module.m_name
326         log_to_file segname.tmp on
327         printf "%s", $kicknode->s_module.m_name
328         end_log
329         shell sed -i 's/.*:\(.*\)/\1/' segname.tmp
330         log_to_file loadseg.tmp on
331         printf "add-symbol-file "
332         end_log
333         shell head -n1 segname.tmp >>loadseg.tmp
334         log_to_file loadseg.tmp off
335         printf " %p", $kicknode->s_lowest
336         if $kicknode->s_next != 0
337           set $kicknode = $kicknode->s_next
338           while ($kicknode != 0) && $step < 5
339             if strcmp($kicknode->s_name, ".text") == 0
340               loop_break
341             end
342             printf " -s %s %p", $kicknode->s_name, $kicknode->s_lowest
343             set $step = $step + 1
344             set $kicknode = $kicknode->s_next
345           end
346         end
347         end_log
348         source loadseg.tmp
349         loop_break
350       end
351       set $kicknode = $kicknode->s_next
352     end
353   end
354   if $step < 2
355     printf "no matching module for this address\n"
356   end
357   else
358     printf "no debug symbols found\n"
359   end
361 document loadseg
362 Loads the module that contains the given address
365 define seglistdump
366     set $nextseg = $arg0
367     set $count   = 1
369     printf "Hunk num. | Start addr | Size       \n"
370     printf "----------+------------+------------\n"
371     while $nextseg
372         printf "%9d | %p | %10d\n", $count, $nextseg + sizeof(BPTR), *((ULONG *)$nextseg - 1) - sizeof(BPTR)
374         set $nextseg = *(BPTR *)$nextseg
375         set $count = $count+1
376     end
378 document seglistdump
379 Shows the segments chain of the given seglist