Tag Archives: FreeSWITCH

Freeswitch重新编译时报错:/usr/lib/libnss3.so: undefined reference to `PR_FindSymbol’

原来按照官方指南在CentOS 6.4上安装的Freeswitch,一切顺利。后来需要增加一个xml curl模块,修改了modules.conf之后编译出错:

/usr/lib/libnss3.so: undefined reference to `PR_FindSymbol'
/usr/lib/libnss3.so: undefined reference to `PR_RWLock_Rlock'
/usr/lib/libssl3.so: undefined reference to `PR_OpenAnonFileMap'
/usr/lib/libnss3.so: undefined reference to `PR_UnloadLibrary'
/usr/lib/libnss3.so: undefined reference to `PL_InitArenaPool'
/usr/lib/libnss3.so: undefined reference to `PR_NewRWLock'
/usr/lib/libnss3.so: undefined reference to `PR_RWLock_Wlock'
/usr/lib/libnss3.so: undefined reference to `PR_LoadLibrary'
/lib/libldap_r-2.4.so.2: undefined reference to `PR_GetEnv'
/usr/lib/libnssutil3.so: undefined reference to `PR_LoadLibraryWithFlags'
/usr/lib/libnssutil3.so: undefined reference to `PL_ClearArenaPool'
/usr/lib/libnss3.so: undefined reference to `PR_DestroyRWLock'
/usr/lib/libnss3.so: undefined reference to `PR_NewTCPSocket'
/lib/libldap_r-2.4.so.2: undefined reference to `PR_SetEnv'
/lib/libldap_r-2.4.so.2: undefined reference to `PR_GetLibraryName'
/usr/lib/libssl3.so: undefined reference to `PR_ErrorInstallTable'
/usr/lib/libssl3.so: undefined reference to `PR_ExportFileMapAsString'
/usr/lib/libnssutil3.so: undefined reference to `PR_GetLibraryFilePathname'
/usr/lib/libnss3.so: undefined reference to `PR_FindFunctionSymbol'
/usr/lib/libsmime3.so: undefined reference to `PL_NewHashTable'
/lib/libldap_r-2.4.so.2: undefined reference to `PR_ErrorToString'
/usr/lib/libnss3.so: undefined reference to `PR_RWLock_Unlock'
/usr/lib/libssl3.so: undefined reference to `PR_ImportFileMapFromString'
/lib/libldap_r-2.4.so.2: undefined reference to `PR_GetDirectorySeparator'
collect2: ld returned 1 exit status
make[1]: *** [freeswitch] 错误 1
make: *** [all] 错误 2

搜了一下,找到一个Bug报告,大概意思就是在CentOS6上libcurl用到了libnss3.so,而libnss3.so需要libnspr4.so。第一次make的时候用了系统提供的/lib/libnspr4.so,这个没问题。然后再编译的时候就去用了/usr/local/freeswitch/lib/libnspr4.so,这个就有问题了。解决方法有两个,一是 ./configure –without-libcurl,而是删掉/usr/local/freeswitch/lib。

不过第一个方法对我来说不管用,因为xml curl本来就需要用到libcurl,不能去掉。

FreeSWITCH ESL Client内存溢出

Linphone 1.x版本还不支持SUBSCRIBE/NOTIFY,所以也无法知道好友的状态,不得以做了一个代理,客户端每隔一段时间通过代理去freeswitch查询状态,代理用freeswitch ESL Client类连接freeswitch,但是代理运行一段时间之后就会内存溢出,然后崩溃。

2013-04-07 11:16:09,378 WARN [org.apache.mina.filter.logging.LoggingFilter] (LoggingFilter.java:123) – EXCEPTION :
java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:633)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:95)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool$Preallocation.<init>(SocketSendBufferPool.java:156)
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool.<init>(SocketSendBufferPool.java:42)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.<init>(AbstractNioWorker.java:44)
at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:28)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.newWorker(AbstractNioWorkerPool.java:99)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:69)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:39)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:33)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:152)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:117)
at org.freeswitch.esl.client.inbound.Client.connect(Client.java:113)

本来以为是程序里头什么地方资源没释放,后来查了一下,倒还真不是那么回事儿。

具体可以看看:Netty内存泄露XSocket内存泄漏问题深度分析,第一个讲的是现象,第二个更深入一些,说问题在于DirectByteBuffer。

不过第二个实施起来有点难度,而且也不能完全解决问题;而org.freeswitch.esl.client.inbound.Client里头用的NioClientSocketChannelFactory类作为一个工厂类确实没有必要每次都new,做成静态的即可。

于是改代码,然后重新编译。基本就是git和maven,具体可以参考:http://wiki.freeswitch.org/wiki/Java_ESL_Client