define helper functions
cat >mysql.gdb <<'EOF'
#set interactive-mode off
set confirm off
dont-repeat
define show_processlist
#argc is not available in older version gdb
#if $argc==1
# set $p_thread_id=(long long)$arg0
#else
set $p_thread_id=(long long)-1
#end
set $current=((base_ilist)threads).first
set $last=&(((base_ilist)threads).last)
printf "Id\tUser\tHost\tDb\tCommand\tTime\tState\tInfo\n"
while $current != $last
set $tmp=(class THD *)$current
set $tmp_sctx=$tmp->security_ctx
if ( $p_thread_id == -1 || $p_thread_id == $tmp->thread_id )
set $id=$tmp->thread_id
set $user=(char*)($tmp_sctx->user?$tmp_sctx->user:($tmp->system_thread?"system user":"unauthenticated user"))
set $host=$tmp_sctx->host_or_ip
set $db=($tmp->db)?$tmp->db:"NULL"
set $command=(int)($tmp->command)
#set $proc_info=(char*)(($tmp->killed==THD::KILL_CONNECTION)?"Killed":0) #5.1
set $proc_info=(char*)($tmp->killed?"Killed":0)
set $state_info=(char*) ($tmp->locked ? "Locked" : $tmp->net.reading_or_writing ? ($tmp->net.reading_or_writing == 2 ? "Writing to net" : $command == COM_SLEEP ? "" : "Reading from net") : $tmp->proc_info ? $tmp->proc_info : ($tmp->mysys_var && $tmp->mysys_var->current_cond) ? "Waiting on cond" : "NULL")
set $start_time=$tmp->start_time
#set $now=my_time(0) #5.1
set $now=time((time_t*) 0)
set $query=(char*)($tmp->query_string.str?$tmp->query_string.str:"")
printf "%u\t%s\t%s\t%s\t%s\t%u\t%s\t%.100s\n",$id,$user,$host,$db,command_name[$command].str,$now-$start_time,$state_info,$query
end
set $current=$current->next
end
end
document show_processlist
Prints MySQL process list.
Syntax: show_processlist [thread id]
Examples:
show_processlist
show_processlist 123
show_processlist -1
end
define kill_thread
#if $argc >= 1
set $p_thread_id=(unsigned long long)$arg0
#set $p_only_kill_query=(char *)(($argc >= 2)?$arg1:"connection")
set $p_only_kill_query=(char *)$arg1
set $only_kill_query=(strcmp($p_only_kill_query,(char *)"query")==0)?1:0
set $current=((base_ilist)threads).first
set $last=&(((base_ilist)threads).last)
while $current != $last
set $tmp=(class THD *)$current
if $p_thread_id == $tmp->thread_id
set $id=$tmp->thread_id
printf "kill thread id %d %s\n", $id, $only_kill_query?"only query":""
#call kill_one_thread($tmp, $id, $only_kill_query)
call sql_kill($tmp, $id, $only_kill_query)
loop_break
end
set $current=$current->next
end
#else
# help kill_thread
#end
end
document kill_thread
Kills MySQL thread.
Syntax: kill_thread <thread id> <query|connection>
Examples:
kill_thread 123
kill_thread 123 "connection"
kill_thread 321 "query"
end
EOF
show processlist
mysql_port=8217
# older version gdb does not support '-ex' option
#gdb -batch -silent -p $(pgrep -f "/mysqld .*$mysql_port"|head -n1) -x mysql.gdb -ex 'show_processlist'
gdb -silent -p $(pgrep -f "/mysqld .*$mysql_port"|head -n1) -x mysql.gdb <<'EOF' |\
sed -n '/^=====begin=====$/,/=====end=====/p'|sed '1d;$d'
set prompt
set pagination off
printf "\n\n"
printf "=====begin=====\n"
show_processlist
printf "=====end=====\n"
EOF
kill thread
thread_id=223 gdb -silent -p $(pgrep -f "/mysqld .*$mysql_port"|head -n1) -x mysql.gdb <<EOF kill_thread $thread_id "connect" EOF

No comments:
Post a Comment