gdb ./objs/srs
set args -c ./conf/rtmp.conf
b SrsThreadContext::generate_id
r
第一次断下的bt输出(设置主线程的 cid 100)
#0 SrsThreadContext::generate_id (this=0x8d52b0) at src/app/srs_app_log.cpp:50 #1 0x0000000000475076 in SrsServer::initialize_st (this=0x8d53e0) at src/app/srs_app_server.cpp:638 #2 0x000000000053475a in run_master () at src/main/srs_main_server.cpp:386 #3 0x000000000053442b in run () at src/main/srs_main_server.cpp:341 #4 0x00000000005343a9 in main (argc=3, argv=0x7fffffffe618) at src/main/srs_main_server.cpp:334
主线程的cid为100
执行c命令后的输出
(gdb) c Continuing. [2017-05-12 02:44:08.931][trace][1974][100] server main cid=100, pid=1974, ppid=1927, asprocess=0 [2017-05-12 02:44:08.931][trace][1974][100] write pid=1974 to ./objs/srs.pid success!
可以看到输出 cid=100,即 _srs_context->get_id()
---------------------------------------------------------
第二次断下的bt输出(设置 rtmp监听线程的 cid 101)
#0 SrsThreadContext::generate_id (this=0x8d52b0) at src/app/srs_app_log.cpp:50 #1 0x00000000004accd3 in internal::SrsThread::thread_cycle (this=0x8f3040) at src/app/srs_app_thread.cpp:184 #2 0x00000000004ad049 in internal::SrsThread::thread_fun (arg=0x8f3040) at src/app/srs_app_thread.cpp:245 #3 0x0000000000535371 in _st_thread_main () at sched.c:327 #4 0x0000000000535ae1 in st_thread_create (start=0x536258 <st_usleep+197>, arg=0x7fffffffe270, joinable=32767, stk_size=-134365648) at sched.c:591 #5 0x00000000004acaba in internal::SrsThread::start (this=0x8f3040) at src/app/srs_app_thread.cpp:110 #6 0x00000000004ad9f3 in SrsReusableThread::start (this=0x8f3020) at src/app/srs_app_thread.cpp:437 #7 0x000000000052c9c8 in SrsTcpListener::listen (this=0x8f2fe0) at src/app/srs_app_listener.cpp:251 #8 0x0000000000471ee5 in SrsStreamListener::listen (this=0x8f2f80, i="0.0.0.0", p=1935) at src/app/srs_app_server.cpp:153 #9 0x0000000000477987 in SrsServer::listen_rtmp (this=0x8d53e0) at src/app/srs_app_server.cpp:1089 #10 0x0000000000475866 in SrsServer::listen (this=0x8d53e0) at src/app/srs_app_server.cpp:743 #11 0x000000000053480b in run_master () at src/main/srs_main_server.cpp:398 #12 0x000000000053442b in run () at src/main/srs_main_server.cpp:341 #13 0x00000000005343a9 in main (argc=3, argv=0x7fffffffe618) at src/main/srs_main_server.cpp:334
---------------------------------------------------------------
第三次断下的bt输出(设置 SignalManager 监听线程的 cid 102)
#0 SrsThreadContext::generate_id (this=0x8d52b0) at src/app/srs_app_log.cpp:50 #1 0x00000000004accd3 in internal::SrsThread::thread_cycle (this=0x8d6870) at src/app/srs_app_thread.cpp:184 #2 0x00000000004ad049 in internal::SrsThread::thread_fun (arg=0x8d6870) at src/app/srs_app_thread.cpp:245 #3 0x0000000000535371 in _st_thread_main () at sched.c:327 #4 0x0000000000535ae1 in st_thread_create (start=0x536258 <st_usleep+197>, arg=0x7fffffffe330, joinable=32767, stk_size=-134365648) at sched.c:591 #5 0x00000000004acaba in internal::SrsThread::start (this=0x8d6870) at src/app/srs_app_thread.cpp:110 #6 0x00000000004ad31d in SrsEndlessThread::start (this=0x8d5a90) at src/app/srs_app_thread.cpp:299 #7 0x00000000004740f5 in SrsSignalManager::start (this=0x8d6840) at src/app/srs_app_server.cpp:441 #8 0x0000000000475931 in SrsServer::register_signal (this=0x8d53e0) at src/app/srs_app_server.cpp:765 #9 0x0000000000534846 in run_master () at src/main/srs_main_server.cpp:402 #10 0x000000000053442b in run () at src/main/srs_main_server.cpp:341 #11 0x00000000005343a9 in main (argc=3, argv=0x7fffffffe618) at src/main/srs_main_server.cpp:334
------------------------------------------------------------------------
第四次断下的bt输出(设置 Ingester 监听线程的 cid 103)
#1 0x00000000004accd3 in internal::SrsThread::thread_cycle (this=0x8d6bb0) at src/app/srs_app_thread.cpp:184 #2 0x00000000004ad049 in internal::SrsThread::thread_fun (arg=0x8d6bb0) at src/app/srs_app_thread.cpp:245 #3 0x0000000000535371 in _st_thread_main () at sched.c:327 #4 0x0000000000535ae1 in st_thread_create (start=0x536258 <st_usleep+197>, arg=0x7fffffffe390, joinable=32767, stk_size=-134439376) at sched.c:591 #5 0x00000000004acaba in internal::SrsThread::start (this=0x8d6bb0) at src/app/srs_app_thread.cpp:110 #6 0x00000000004ad9f3 in SrsReusableThread::start (this=0x8d6b90) at src/app/srs_app_thread.cpp:437 #7 0x00000000004f0016 in SrsIngester::start (this=0x8d6b50) at src/app/srs_app_ingest.cpp:135 #8 0x0000000000476d69 in SrsServer::ingest (this=0x8d53e0) at src/app/srs_app_server.cpp:852 #9 0x00000000005348b9 in run_master () at src/main/srs_main_server.cpp:410 #10 0x000000000053442b in run () at src/main/srs_main_server.cpp:341 #11 0x00000000005343a9 in main (argc=3, argv=0x7fffffffe618) at src/main/srs_main_server.cpp:334
执行c命令后的输出
Continuing. [2017-05-12 02:56:27.779][trace][1974][100] ingest thread cid=103, current_cid=100
这条输出的代码如下
int SrsIngester::start() { int ret = ERROR_SUCCESS; if ((ret = parse()) != ERROR_SUCCESS) { clear_engines(); ret = ERROR_SUCCESS; return ret; } // even no ingesters, we must also start it, // for the reload may add more ingesters. // start thread to run all encoding engines. if ((ret = pthread->start()) != ERROR_SUCCESS) { srs_error("st_thread_create failed. ret=%d", ret); return ret; } srs_trace("ingest thread cid=%d, current_cid=%d", pthread->cid(), _srs_context->get_id()); return ret; }
_srs_context->get_id返回的是当前st线程的cid(100),根据上面的调用堆栈可以
看到是从main函数运行到此处的
int SrsThreadContext::get_id() { return cache[st_thread_self()]; }
//返回当前st线程的cid
------------------------------------------------------------------------
至此在初始化过程不会再命中断点
-------------------------------------------------------------------------
开始推流到rtmp://192.168.151.151/live/marstv
后再次断下
#0 SrsThreadContext::generate_id (this=0x8d52b0) at src/app/srs_app_log.cpp:50 #1 0x00000000004accd3 in internal::SrsThread::thread_cycle (this=0x8f4fb0) at src/app/srs_app_thread.cpp:184 #2 0x00000000004ad049 in internal::SrsThread::thread_fun (arg=0x8f4fb0) at src/app/srs_app_thread.cpp:245 #3 0x0000000000535371 in _st_thread_main () at sched.c:327 #4 0x0000000000535ae1 in st_thread_create (start=0x536258 <st_usleep+197>, arg=0x7ffff7fdbb60, joinable=32767, stk_size=-134722000) at sched.c:591 #5 0x00000000004acaba in internal::SrsThread::start (this=0x8f4fb0) at src/app/srs_app_thread.cpp:110 #6 0x00000000004ad675 in SrsOneCycleThread::start (this=0x8f4f90) at src/app/srs_app_thread.cpp:367 #7 0x000000000047bbad in SrsConnection::start (this=0x8f4f48) at src/app/srs_app_conn.cpp:77 #8 0x0000000000478bc9 in SrsServer::accept_client (this=0x8d53e0, type=SrsListenerRtmpStream, client_stfd=0x8f4b70) at src/app/srs_app_server.cpp:1304 #9 0x0000000000472150 in SrsStreamListener::on_tcp_client (this=0x8f2f80, stfd=0x8f4b70) at src/app/srs_app_server.cpp:171 #10 0x000000000052cb49 in SrsTcpListener::cycle (this=0x8f2fe0) at src/app/srs_app_listener.cpp:275 #11 0x00000000004ada7d in SrsReusableThread::cycle (this=0x8f3020) at src/app/srs_app_thread.cpp:452 #12 0x00000000004ace3b in internal::SrsThread::thread_cycle (this=0x8f3040) at src/app/srs_app_thread.cpp:207 #13 0x00000000004ad049 in internal::SrsThread::thread_fun (arg=0x8f3040) at src/app/srs_app_thread.cpp:245 #14 0x0000000000535371 in _st_thread_main () at sched.c:327 #15 0x0000000000535ae1 in st_thread_create (start=0x915000, arg=0x3e8, joinable=32767, stk_size=-150456151) at sched.c:591 #16 0x000000000001ff40 in ?? () #17 0x0000000000000000 in ?? ()
#12 处 this=0x8f3040
前面创建rtmp监听线程的#1 处 this=0x8f3040
从中可以看出是在rtmp监听线程里创建一个新的st线程来处理这个推流
新st线程的cid 为104,推流SrsThread对象地址为 this=0x8f4fb0