在应用程序中启动多个grpc :: ServerBuilders是否有任何限制?

时间:2017-05-19 18:08:12

标签: grpc

在Ubuntu 14.04上运行的我的C ++应用程序出现问题。我正在使用grpc与go webserver应用程序进行通信,该应用程序正在为具有c ++应用程序状态/配置的网页提供服务。

我一直在使用1年前版本的grpc 0.14,所以在发布之前,我升级了所有内容(grpc 1.3.1,版本1.8.1)。

似乎我的c ++应用程序经常崩溃1.3.1(以及1.0.0,1.2.5,1.2.0等)grpc版本。

我正在获得一个带有双重免费警告的sigabort。应用程序将运行一段时间,但在Web应用程序从c ++应用程序请求数据一段时间后,它将崩溃:gdb输出:

[New LWP 9908]
[New LWP 9881]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./bhio'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  _int_malloc (av=0x7fb3ac000020, bytes=16) at malloc.c:3351
3351    malloc.c: No such file or directory.
(gdb) where
#0  _int_malloc (av=0x7fb3ac000020, bytes=16) at malloc.c:3351
#1  0x00007fb4205db6c0 in __GI___libc_malloc (bytes=16) at malloc.c:2891
#2  0x000000000076bb2f in gpr_malloc ()
#3  0x000000000077678d in grpc_error_create ()
#4  0x000000000078ba94 in ?? ()
#5  0x000000000078dbee in grpc_chttp2_fail_pending_writes ()
#6  0x000000000078e19f in grpc_chttp2_mark_stream_closed ()
#7  0x000000000078e2eb in grpc_chttp2_cancel_stream ()
#8  0x000000000078ef1c in ?? ()
#9  0x000000000077597e in grpc_combiner_continue_exec_ctx ()
#10 0x0000000000777678 in grpc_exec_ctx_flush ()
#11 0x000000000078095f in grpc_call_cancel_with_status ()
#12 0x0000000000780be1 in grpc_call_destroy ()
#13 0x0000000000769bd7 in grpc::ServerContext::~ServerContext() ()
#14 0x0000000000768c7c in grpc::Server::SyncRequest::CallData::~CallData() ()
#15 0x00000000007691e3 in 
grpc::Server::SyncRequestThreadManager::DoWork(void*, bool) ()
#16 0x000000000076aff1 in grpc::ThreadManager::MainWorkLoop() ()
#17 0x000000000076b04c in grpc::ThreadManager::WorkerThread::Run() ()
#18 0x00007fb420eebbf0 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#19 0x00007fb421146184 in start_thread (arg=0x7fb3ca686700)
at pthread_create.c:312
#20 0x00007fb42065337d in clone ()
---Type <return> to continue, or q <return> to quit---
  at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
(gdb)
(gdb) quit

或在这里:

[Thread 0x7fff7d7fa700 (LWP 3521) exited]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fff7e7fc700 (LWP 3524)]
__GI___libc_free (mem=0xb5) at malloc.c:2929
2929    malloc.c: No such file or directory.
(gdb)
(gdb) where
#0  __GI___libc_free (mem=0xb5) at malloc.c:2929
#1  0x000000000077b7b5 in grpc_byte_buffer_destroy ()
#2  0x0000000000773ac3 in grpc::Server::SyncRequest::CallData::~CallData() ()
#3  0x000000000077405a in grpc::Server::SyncRequestThreadManager::DoWork(void*, bool) ()
#4  0x0000000000776111 in grpc::ThreadManager::MainWorkLoop() ()
#5  0x000000000077616c in grpc::ThreadManager::WorkerThread::Run() ()
#6  0x00007ffff6c9fbf0 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff6efa184 in start_thread (arg=0x7fff7e7fc700)
at pthread_create.c:312
#8  0x00007ffff640737d in clone ()
at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

因此,如果可以启动多个serverbuilder,那么上面的错误还有什么指向我可能在使用grpc库时出错...我正在为编写它的其他人带来这个代码,所以我的知识缺乏使用grpc ...我不认为grpc是不稳定的,所以它必须是我通过错误地使用它做的事情。

任何想法都会有所帮助..

任何更好地调试它的建议都会有所帮助。

对于grpc构建,我只是做以下事情:

$ git clone -b $(curl -L http://grpc.io/releasehttps://github.com/grpc/grpc

$ cd grpc

$ git submodule update --init

$ make

$ [sudo] make install

是否存在可能提供更多信息的不同编译选项?

提前感谢您的帮助/建议。

鲍勃

1 个答案:

答案 0 :(得分:0)

事实证明,注册服务功能中的小内存泄漏(缺少套接字文件描述符的关闭)导致了这个问题。