gRPC C : средство очистки адреса: без сбоев

#c #grpc

#c #стеклопластик #c #grpc

Вопрос:

gRPC v1.30.0 Я создал службу grpc и попытался запустить ее. Выполнение проходит гладко до последнего оператора return на стороне сервера.

 Status theService(ServerContext *context, const Request* req, Response* res)
{
        Status status = actualLogic(req,res);   
        //execution goes fine till here 
        return status;
} 


Status actualLogic(req,res)
{
        Response_NestedMsg msg;
        msg.set_something(...);
        res->mutable_nestedmsg()->CopyFrom(msg);
        return Status::OK
}

//server startup code
ServerBuilder builder;        
builder.AddListeningPort((address),grpc::InsecureServerCredentials());
builder.RegisterService(amp;serviceClassObj);
std::unique_ptr<Server> server(builder.BuildAndStart());
server->Wait();
  

Запуская этот код, я получаю следующую ошибку во время выполнения

 ==14394==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x61b00000fcc8 in thread T5 (grpcpp_sync_ser)
    #0 0x7fe9d35602c0 in operator delete(void*) (/usr/lib/x86_64-linux-gnu/libasan.so.4 0xe12c0)
    #1 0x55cb87299afd in __gnu_cxx::new_allocator<std::_List_node<grpc_impl::Server const*> >::deallocate(std::_List_node<grpc_impl::Server const*>*, unsigned long) (/home/john/Desktop/my_executable 0xd0afd)
    #2 0x55cb87297ba1 in std::allocator_traits<std::allocator<std::_List_node<grpc_impl::Server const*> > >::deallocate(std::allocator<std::_List_node<grpc_impl::Server const*> >amp;, std::_List_node<grpc_impl::Server const*>*, unsigned long) (/home/john/Desktop/my_executable 0xceba1)
    #3 0x55cb8729448d in std::__cxx11::_List_base<grpc_impl::Server const*, std::allocator<grpc_impl::Server const*> >::_M_put_node(std::_List_node<grpc_impl::Server const*>*) (/home/john/Desktop/my_executable 0xcb48d)
    #4 0x55cb8728bb5a in std::__cxx11::_List_base<grpc_impl::Server const*, std::allocator<grpc_impl::Server const*> >::_M_clear() (/home/john/Desktop/my_executable 0xc2b5a)
    #5 0x55cb87287307 in std::__cxx11::_List_base<grpc_impl::Server const*, std::allocator<grpc_impl::Server const*> >::~_List_base() (/home/john/Desktop/my_executable 0xbe307)
    #6 0x55cb87278d29 in std::__cxx11::list<grpc_impl::Server const*, std::allocator<grpc_impl::Server const*> >::~list() (/home/john/Desktop/my_executable 0xafd29)
    #7 0x55cb87278e2c in grpc_impl::CompletionQueue::~CompletionQueue() (/home/john/Desktop/my_executable 0xafe2c)
    #8 0x7fe9d1826998 in grpc_impl::Server::SyncRequest::CallData::ContinueRunAfterInterception() (/usr/local/lib/libgrpc  .so.1 0x6f998)
    #9 0x7fe9d18278ee in grpc_impl::Server::SyncRequestThreadManager::DoWork(void*, bool, bool) (/usr/local/lib/libgrpc  .so.1 0x708ee)
    #10 0x7fe9d182c4ca in grpc::ThreadManager::MainWorkLoop() (/usr/local/lib/libgrpc  .so.1 0x754ca)
    #11 0x7fe9d182c68b in grpc::ThreadManager::WorkerThread::Run() (/usr/local/lib/libgrpc  .so.1 0x7568b)
    #12 0x7fe9cf5a78d2 in grpc_core::(anonymous namespace)::ThreadInternalsPosix::ThreadInternalsPosix(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options constamp;)::{lambda(void*)#1}::_FUN(void*) (/usr/local/lib/libgpr.so.10 0x118d2)
    #13 0x7fe9d1eef6da in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0 0x76da)
    #14 0x7fe9d0ba8a3e in __clone (/lib/x86_64-linux-gnu/libc.so.6 0x121a3e)

0x61b00000fcc8 is located 72 bytes inside of 1448-byte region [0x61b00000fc80,0x61b000010228)
allocated by thread T5 (grpcpp_sync_ser) here:
    #0 0x7fe9d355f448 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4 0xe0448)
    #1 0x7fe9d18274f2 in grpc_impl::Server::SyncRequestThreadManager::DoWork(void*, bool, bool) (/usr/local/lib/libgrpc  .so.1 0x704f2)

Thread T5 (grpcpp_sync_ser) created by T0 here:
    #0 0x7fe9d34b6d2f in __interceptor_pthread_create (/usr/lib/x86_64-linux-gnu/libasan.so.4 0x37d2f)
    #1 0x7fe9cf5a7a92 in grpc_core::Thread::Thread(char const*, void (*)(void*), void*, bool*, grpc_core::Thread::Options constamp;) (/usr/local/lib/libgpr.so.10 0x11a92)

SUMMARY: AddressSanitizer: bad-free (/usr/lib/x86_64-linux-gnu/libasan.so.4 0xe12c0) in operator delete(void*)
==14394==ABORTING
  

Ни один из моих кодов не пытается освободить какой-либо указатель, и ошибка, похоже, исходит только из какого-то автоматически сгенерированного файла. Пожалуйста, предложите, если требуется еще какой-то код / детали.

Ответ №1:

Я кратко проверил сообщение об ошибке и код, но мне это кажется странным, потому что как выделение, так и уничтожение были выполнены C new amp; delete. Это также согласуется с вашим сообщением об ошибке.

 ### Destruction (with operator delete)
#0 0x7fe9d35602c0 in operator delete(void*) (/usr/lib/x86_64-linux-gnu/libasan.so.4 0xe12c0)

### Allocation (with operator new)
#0 0x7fe9d355f448 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4 0xe0448)
  

Это может быть вызвано другими проблемами, такими как ошибка ASAN или настроенный распределитель памяти.

Комментарии:

1. Спасибо. Хотя использовался средство очистки адресов по умолчанию, его отключение решило проблему