####################################################################
# take a java core dump from a running server. ####################################################################
proc dumpThreads { serverName } {
global AdminConfig
global AdminControl
putsLog "[ lindex [ info proc ] 0 ]"
foreach i [ info args dumpThreads ] {
upvar 0 $i ilocal
set propertiesArray($i) $ilocal
}
putsLog "properties are.................."
foreach { a b } [ array get propertiesArray ] {
putsLog [ format "%-25s %s" "$a" "$b" ]
}
set serverId [ $AdminConfig getid /Server:$serverName ]
#set serverId [$AdminControl completeObjectName type=JVM,process=$serverName,*]
if { [ string length $serverId ] == 0 } {
putsLog "ERROR: $serverName does not exist"
return -code error
}
# get the location of the working directory from the process definition child of the server object.
#set processDefinitionId [ lindex [ $AdminConfig showAttribute $serverId processDefinitions ] 0 ]
set processDefinitionId [ lindex [ $AdminConfig showAttribute $serverId processDefinition ] 0 ]
set workingDirectory [ $AdminConfig showAttribute $processDefinitionId workingDirectory ]
# if the working directory value is a variable rather than a physical directory get the value of the variable from the node variable map.
if { [ file isfile $workingDirectory ] == 1 } {
# get the node name by parsing the server object id string
putsLog "find the variable"
set x [ expr [ string first "nodes/" $serverId ] + 6 ]
set y [ expr { [ string first "/" $serverId $x ] -1 } ]
set nodeName [ string range $serverId $x $y ]
set nodeVarMapId [ $AdminConfig getid /Node:$nodeName/VariableMap:/ ]
set entriesId [ $AdminConfig showAttribute $nodeVarMapId entries ]
# sort and print the variables
foreach i [ lindex $entriesId 0 ] {
lappend varList [ list [ $AdminConfig showAttribute $i symbolicName ] [ $AdminConfig showAttribute $i value ] $i ]
}
set varList [ lsort -index 0 $varList ]
putsLog "variable list is......................."
foreach e $varList { putsLog [ format "%-30s %-s" "[ lindex $e 0 ]" "[ lindex $e 1 ]" ] }
# strip the $ and braces off the variable.
set workDirVar [ string trimright [string trimleft "\$\{USER_INSTALL_ROOT\}" "\$\{"] "\}" ]
# look for a match.
foreach i $varList {
if { [ string match $workDirVar [ lindex [ lindex $i 0 ] 0 ] ] == 1 } {
putsLog "match............."
putsLog "working directory is [ lindex [ lindex $i 0 ] 0 ] [ lindex [ lindex $i 1 ] 0 ]"
break
}
}
} else {
putsLog "working directory is $workingDirectory"
}
# dump the threads
# The server must be running. Get the mbean.
if { [ catch { $AdminControl completeObjectName type=JVM,process=$serverName,* } r ] == 0 } {
if { [ string length $r ] == {} } {
putsLog " $serverName not running"
return -code error
} else {
set jvmId $r
putsLog "dumping threads....................."
if { [ catch { $AdminControl invoke $jvmId dumpThreads } r ] == 0 } {
putsLog "$serverName - threads dumped successfully"
} else {
return -code error $r
}
}
} else {
putsLog $r
return -code error $r
}
putsLog "*** the End ***"
}