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

posted @ 2017-06-13 16:36  YYPapa  阅读(555)  评论(0编辑  收藏  举报