gRP C утечки памяти - PullRequest
       12

gRP C утечки памяти

0 голосов
/ 27 марта 2020

Мой проект Visual Studio, использующий библиотеку gRP C, имеет утечки памяти. После некоторых исследований и разработок я сделал небольшой проект для воспроизведения проблемы и обнаружил, что даже нет необходимости вызывать какой-либо объект gRP C в моем коде. Мои шаги:

1) Получить helloworld.proto из примеров

2) Создать файлы C ++

3) Создать проект C ++ со следующим кодом:

#include "helloworld.grpc.pb.h"

void f(){
  helloworld::HelloRequest request;
}

int main(){
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  return 0;
}

Часть вывода (полный дамп имеет 240 строк):

Detected memory leaks!
Dumping objects ->
{1450} normal block at 0x00FD77A0, 16 bytes long.
 Data: <`{   t   C   |  > 60 7B FD 00 20 74 FD 00 84 43 CA 00 88 7C CA 00 
{1449} normal block at 0x00FECA30, 48 bytes long.
 Data: <google.protobuf.> 67 6F 6F 67 6C 65 2E 70 72 6F 74 6F 62 75 66 2E 
{1448} normal block at 0x00FEA048, 8 bytes long.
 Data: <        > 20 C6 FE 00 00 00 00 00 
{1447} normal block at 0x00FEC610, 52 bytes long.
 Data: < v  p"   v      > B8 76 FC 00 70 22 FE 00 B8 76 FC 00 00 00 CD CD 
{1441} normal block at 0x00FEA610, 32 bytes long.
 Data: <google.protobuf.> 67 6F 6F 67 6C 65 2E 70 72 6F 74 6F 62 75 66 2E 
{1440} normal block at 0x00FE9B78, 8 bytes long.

Если я добавлю google::protobuf::ShutdownProtobufLibrary(); строку до return 0;, у меня будет намного меньше вывода. Только это:

Detected memory leaks!
Dumping objects ->
{160} normal block at 0x00FCD858, 4 bytes long.
 Data: <    > 18 D6 B9 00 
{159} normal block at 0x00FCD618, 4 bytes long.
 Data: < >  > C8 3E B9 00 
{158} normal block at 0x00FCD678, 4 bytes long.
 Data: < ?  > D0 3F B9 00 
Object dump complete.

Но если я добавлю несколько сгенерированных источников со многими и большими services и messages, дамп памяти будет намного больше.

Так как я действительно не надену Не используйте любые объекты gRP C напрямую, я могу себе представить только одно, что некоторые static объекты еще живы, когда VS Memory Dumper начинает работать.

Есть ли способ исправить это или предложение что я могу с этим сделать?

UPD:

Я сделал несколько дополнительных работ для решения этой проблемы и открыл новый выпуск на трекере ошибок репозитория grp c: https://github.com/grpc/grpc/issues/22506

Описание проблемы по этому вопросу содержит снимки экрана с утечкой стека выделения ресурсов и gRP C трассировки отладки.

UPD2:

Я нашел их все (версия 1.23.0). Я оставил там подробный комментарий: https://github.com/grpc/grpc/issues/22506#issuecomment -618406755

...