GDB中遍历art::Thread打印local reference的脚本
#打印所有线程对应的local reference
def dump_all_local_refernce
set $list_head = &art::Runtime::instance_.thread_list_.list_.__end_
set $list_node = $list_head->__next_
while $list_node != $list_head
set $tid = $list_node->__value_->tls32_.tid
set $top_index = $list_node->__value_->tlsPtr_.jni_env->locals.segment_state_.parts.topIndex
printf "tid = %d, top_index = %d\n",$tid,$top_index
set $list_node = $list_node->__next_
end
end
#打印指定线程的local reference
def dump_local_refernce_by_tid
set $list_head =
&art::Runtime::instance_.thread_list_.list_.__end_
set $list_node = $list_head->__next_
while $list_node != $list_head
if
$list_node->__value_->tls32_.tid == $arg0
set
$local_table = $list_node->__value_->tlsPtr_.jni_env->locals
set
$top_index = $local_table.segment_state_.parts.topIndex
p $top_index
set $index =
0
while $index
< $top_index
set $irt_entry = $local_table.table_[$index]
set $serial = $irt_entry.serial_
set $obj = (unsigned int *)$irt_entry.references_[$serial].root_.reference_
if $obj != 0
p /x *$obj
else
p /x 0x0
end
set $index += 1
end
loop_break
end
set $list_node =
$list_node->__next_
end