由于gdb不能够保存设置的断点,所以我们只有用-x 参数导入一个相当于批处理的文件来设置断点了

我先用ctags来生成tag文件:

代码:
pjq@gentoo-pjq ~/svn/gsopcast-read-only/src $ ctags -f gsopcast.tag *.cc

然后再用命令解析出其中的函数:

代码:
cat gsopcast.tag |grep “(“|cut -d “/” -f2|cut -d “(” -f1|cut -d ” ” -f2|awk ‘NF>0’|sed ‘s/\^//g’|sed ‘s/\*//g’|sed ‘s/^/b /g’>bp.list

这样就生成了设置所有函数断点的文件了:

代码:
pjq@gentoo-pjq ~/svn/gsopcast-read-only/src $ cat bp.list
b cell_data_func_card
b cell_data_func_name
b change_notebook_tab
b channel_list_update
b connect_on_idle
b connect_to_server
b create_iochannel
b delete_iochannel
b destroy
b echo
b fill_launch_combo
b fork_channel
b fork_player
b fork_sop
b get_unique_clip
b handle_io_pipe
b handle_stdout_pipe
b io_socket_record
b io_socket_statistics
b is_running
b kill_player
b kill_sop
b launch_record
b list_operate
b list_search_url
b load_config
b load_tree_state
b main
b on_adj_sound_change_value
b on_button_channel_toggled
b on_button_exit_clicked
b on_button_expand_clicked
b on_button_player_clicked
b on_button_record_clicked
b on_button_save_clicked
b on_button_search_clicked
b on_button_sopcast_clicked
b on_button_stop_clicked
b on_channel_update
b on_entry_search_activated
b on_treeview1_row_activated
b on_window1_destroy
b parse_command_line
b pipe_signals
b processSignal
b quit_on_owner_change
b remote_call
b save_config
b save_tree_state
b setup_unique
b start_statistics_monitor
b statistics_monitor
b statistics_show
b store_tree_state
b timeout_me
b tree_search
b tree_search_key
b trim
b unique_paste_uri
b unique_set_text
b vKeyPressReleaseCallback
pjq@gentoo-pjq ~/svn/gsopcast-read-only/src $

有些函数可能解析错误了,
再用

代码:
gdb -x bp.list gsopcast

启动的时候可以看到,然后再将这些有问题的断点从bp.list中去掉,

之后再调度就没问题了。

详见:http://gentoo-pjq.vicp.net/bbs/viewtopic.php?f=2&t=37&p=44&sid=492a625a38a1fd9af6983039d5443c01#p44

pjq@gentoo-pjq ~/sopcast $ cat psop.sh
#!/bin/sh
#pjq@gentoo-pjq.vicp.net
#USAGE:
#./psop.sh tvname
#example:
#./psop.sh cctv-1
#then you can use mplayer to play the tv
#mplayer http://127.0.0.1:8908
 
#define const
GCHLXML=/tmp/gchlxml
ITEM=/tmp/item
NAME=/tmp/name
TEMP=/tmp/tempfile
TV=$1
#Get the gchlxml if no existing file
[ -f $GCHLXML ] || wget -O $GCHLXML http://channel.sopcast.com/gchlxml
 
cat $GCHLXML|awk -F "item" '{print $2}'|sed 's/>//g'|sed 's/<///g'>$ITEM
cat $GCHLXML|awk -F "name" '{print $2}'|sed  's/>//g'|sed 's/"//g'|sed 's/<///g'|sed 's/=/:/g'>$NAME
paste -d "@" $NAME $ITEM|awk 'NF>0' |sort|uniq|grep -n "" >$TEMP
 
grep -i  $TV $TEMP
echo -n "Input TV number:"
read  number
#echo $number
 
V=`grep -i  $TV $TEMP| grep "$number:" |cut -d "@" -f2`
N=`grep -i  $TV $TEMP| grep "$number:" |cut -d "@" -f1`
echo "Now playing:$N "
pkill sp-sc-auth
sp-sc-auth  $V 3908 8908 >/dev/null &
 
rm $TEMP $NAME $ITEM
 
#[ $2 == 'p' ] && sleep 5 && mplayer http://127.0.0.1:8908

运行效果1:
pjq@gentoo-pjq ~/sopcast $ ./psop.sh cctv-1
72: en:CCTV-1 cn:CCTV-1综合频道CCTV-1 [CCTV-1综合频道]@sop://broker.sopcast.com:3912/15102
Input TV number:72
Now playing:72: en:CCTV-1 cn:CCTV-1综合频道CCTV-1 [CCTV-1综合频道]

运行效果2:
pjq@gentoo-pjq ~/sopcast $ ./psop.sh cctv
10: en:CCTV-5 cn:CCTV-5体育频道CCTV-5 [CCTV-5体育频道]@sop://broker.sopcast.com:3912/6002
72: en:CCTV-1 cn:CCTV-1综合频道CCTV-1 [CCTV-1综合频道]@sop://broker.sopcast.com:3912/15102
74: en:CCTV-2 Finance cn:CCTV-2财经频道CCTV-2@sop://broker.sopcast.com:3912/15103
107: en:CCTV-3 Comedy cn:CCTV-3 综艺频道CCTV-3@sop://broker.sopcast.com:3912/8888
153: en:CCTV-6 Movie cn:CCTV-6电影频道CCTV-6@sop://broker.sopcast.com:3912/6028
180: en:CCTV-8 cn:CCTV-8电视剧频道CCTV-8@sop://broker.sopcast.com:3912/15163
186: en:CCTV-5 cn:CCTV-5体育频道CCTV-5 [CCTV-5体育频道]@sop://broker.sopcast.com:3912/6002
192: en:CCTV-6 Movie cn:CCTV-6电影频道CCTV-6@sop://broker.sopcast.com:3912/6028
194: en:CCTV-3 Comedy cn:CCTV-3 综艺频道CCTV-3@sop://broker.sopcast.com:3912/8888
196: en:CCTV-2 Finance cn:CCTV-2财经频道CCTV-2@sop://broker.sopcast.com:3912/15103
Input TV number:10
Now playing:10: en:CCTV-5 cn:CCTV-5体育频道CCTV-5 [CCTV-5体育频道]

运行过后用mplayer就可以进行播放了:
mplayer http://127.0.0.1:8908

如果要在终端下播放(ctrl+alt+F[1…6]),可以加几个参数:
mplayer http://127.0.0.1:8908 -zoom -x 640 -y -480 -vo fbdev2

这样就可以不进图形界面就可以看网络电视了。