Task Information from a Debugger
Leon Pollak
leonp at plris.com
Tue Nov 16 12:39:17 UTC 2004
On Tuesday 16 November 2004 14:32, Mark VanderVoord wrote:
> I have an application that eventually runs into a problem, where only
> one task seems to be running. Strangely enough, it's the lowest
> priority task in the system. I'd like to be able to look at what the
> priority of all the tasks are, and what the status of the other tasks
> are when this happens.
>
> I have a debugger which I can use to check for this information (an
> Abatron BDI2000), but I don't know where to look. Are the status and
> priority stored in a table somewhere? Can anyone point me to the file
> or structure that I am interested in?
Attached is the file I received from Joel (thanks a lot to him) which does
what you want.
just call the dump_tasks macro.
Regards
--
Leon M.Pollak
leonp at plris dot com
-------------- next part --------------
# $Id: .gdb4rtems,v 1.1 2003/12/08 17:03:49 leonp Exp $
#-------------------------------------------------------------
# GDB macros for analyzing RTEMS threads
####################
# bt_task
#
# ABSTRACT
# Print backtrace of an RTEMS task
#
# ARGUMENTS:
# arg0 = pointer to the Thread_Control of the task.
#
define bt_task
set $stkp = $arg0->Registers.gpr1
set $stkp = *(void**)$stkp
while $stkp != 0
info line **((void**)$stkp+1)
set $stkp = *(void**)$stkp
end
end
####################
# dump1task
#
# ABSTRACT
# Print information about an RTEMS task
#
# ARGUMENTS
# arg0 = Task index in the corresponding _Information table.
# arg1 = pointer to the Thread_Control of the task.
# arg2 = 1 for verbose output, 0 otherwise
#
define dump1task
set $d1t_num = $arg0
set $pt = $arg1
set $d1t_verbose = $arg2
printf "%2d | ", $d1t_num
set $id = $pt->Object.id
set $name = (unsigned int)$pt->Object.name
set $n0 = (char) ($name >> 24)
if $n0 < ' ' || $n0 > 'z'
set $n0=' '
end
printf "%c",$n0
set $n1 = (char) (0xff & ($name >> 16))
if $n1 < ' ' || $n1 > 'z'
set $n1=' '
end
printf "%c",$n1
set $n2 = (char) (0xff & ($name >> 8))
if $n2 < ' ' || $n2 > 'z'
set $n2=' '
end
printf "%c",$n2
set $n3 = (char) (0xff & $name)
if $n3 < ' ' || $n3 > 'z'
set $n3=' '
end
printf "%c | ",$n3
printf "%08x | ",$id
set $state = $pt->current_state
set $pri = $pt->current_priority
printf "%3d | ",$pri
set $ticks = $pt->ticks_executed
printf "%8d | ", $ticks
set $thread_pc = $pt->Registers.pc
printf ""
if $state == 0
printf "READY"
end
if $state & 1
printf "DORM "
end
if $state & 2
printf "SUSP "
end
if $state & 4
printf "TRANS "
end
if $state & 8
printf "DELAY "
end
if $state & 0x10
printf "Wtime "
end
if $state & 0x20
printf "Wbuf "
end
if $state & 0x40
printf "Wseg "
end
if $state & 0x80
printf "Wmsg "
end
if $state & 0x100
printf "Wevnt "
end
if $state & 0x200
printf "Wsem "
end
if $state & 0x400
printf "Wmutex "
end
if $state & 0x800
printf "Wcvar "
end
if $state & 0x1000
printf "Wjatx "
end
if $state & 0x2000
printf "Wrpc "
end
if $state & 0x4000
printf "Wrate "
end
if $state & 0x8000
printf "Wsig "
end
if $state & 0x10000
printf "Wisig "
end
printf "\n\
---+------+----------+-----+----------+------------------------------\n"
if $d1t_verbose
printf "\
BACKTRACE\n\
~~~~~~~~~\n"
bt_task $pt
end
end
####################
# task_header
#
# ABSTRACT
# Print the header of the task list table
#
define task_header
printf "\
=====================================================================\n"
printf "\
# | Name | ID | Pri | Ticks | State\n"
printf "\
---+------+----------+-----+----------+------------------------------\n"
end
####################
# show_task_support
#
# ABSTRACT
# Support routine for verbose listing of a single task
#
# ARGUMENTS
# arg0 = _Information table.
# arg1 = index.
#
define show_task_support
task_header
set $pt = (Thread_Control *)$arg0.local_table[$arg1]
dump1task $arg1 $pt 1
end
####################
# dump_tasks_support
#
# ABSTRACT
# Support routine for verbose listing of all tasks of a given class
#
# ARGUMENTS
# arg0 = _Information table for the class (internal, classic, POSIX etc.).
#
define dump_tasks_support
task_header
set $index = 1
while $index <= $arg0.maximum
set $pt = (Thread_Control *)$arg0.local_table[$index]
if $pt != 0
dump1task $index $pt 0
end
set $index = $index + 1
end
end
####################
# dump_internal_tasks
#
# ABSTRACT
# Dump all internal tasks
#
define dump_internal_tasks
dump_tasks_support _Thread_Internal_information
end
####################
# dump_tasks
#
# ABSTRACT
# Dump all Classic tasks
#
define dump_tasks
dump_tasks_support _RTEMS_tasks_Information
end
####################
# dump_pthreads
#
# ABSTRACT
# Dump all POSIX threads
#
define dump_pthread
dump_tasks_support _POSIX_Threads_Information
end
####################
# dump_all_tasks
#
# ABSTRACT
# Dump all tasks of all classes (internal, POSIX and Classic)
#
define dump_all_tasks
printf "Executing: 0x%x, Heir: 0x%x\n", _Thread_Executing->Object.id,\
_Thread_Heir.Object.id
printf "===============================================================================\n"
printf "Internal Tasks\n"
dump_tasks_support _Thread_Internal_information
printf "===============================================================================\n"
printf "Classic Tasks\n"
dump_tasks_support _RTEMS_tasks_Information
printf "===============================================================================\n"
printf "POSIX Tasks\n"
dump_tasks_support _POSIX_Threads_Information
end
####################
# show_internal_task
#
# ABSTRACT
# Verbosely list a single internal task
#
# ARGUMENTS
# arg0 = index in the _Information table
#
define show_internal_task
show_task_support _Thread_Internal_information $arg0
end
####################
# show_task
#
# ABSTRACT
# Verbosely list a single classic task
#
# ARGUMENTS
# arg0 = index in the _Information table
#
define show_task
show_task_support _RTEMS_tasks_Information $arg0
end
####################
# show_task
#
# ABSTRACT
# Verbosely list a single POSIX thread
#
# ARGUMENTS
# arg0 = index in the _Information table
#
define show_pthread
show_task_support _POSIX_Threads_Information $arg0
end
####################
# rerun application
#
define rer
set $pc=0x10000
continue
end
define run
c
end
define pci
set $pc=$pc+4
end
define o0
kill
O9
end
More information about the users
mailing list