Мой проект 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