172 похожих чатов

Есть енум, в котором 113 вариантов. варианты - это либо немаленькие

структуры, либо немаленькие другие енумы.

заимплементил для верхнеуровневого енума deserialize, который внутри делает матч по строке и, в зависимости от одного из 251 значения этой строки, возвращает енум примерно так:
let value: serde_json::Value = Deserialize::deserialize(deserializer)?;
....
let obj = match tag {
"tag_value_1" => LargeEnum::EnumVariant1(
serde_json::from_value(
value.clone()
).map_err(|e|
D::Error::custom(format!("EnumVariant1 deserialize to LargeEnum::EnumVariant1 with error: {}", e))
)?
),
....
в матче получаю stack overflow.
проверял, если уменьшить кол-во вариантов в match, то паника уходит
как быть?

юзать стандартные serde(tag=...) не катит, т.к. тэг мне нужно передать дальше для десериализации вложенных структур, а serde так не умеет

17 ответов

5 просмотров

Какие вызовы в стеке, если запустить с gdb?

antuan- Автор вопроса
Ivan Boldyrev
Какие вызовы в стеке, если запустить с gdb?

с ллдб, в гдб не умею. наверху стека: * thread #9, name = 'tokio-runtime-w', stop reason = signal SIGSEGV: address access protected (fault address: 0x7ffff5498050) * frame #0: 0x0000555556b74097 main`__rust_probestack + 23 frame #1: 0x00005555563d928a main`_$LT$rust_tdlib..types.._common..TdType$u20$as$u20$serde..de..Deserialize$GT$::deserialize::h37f4e71ff0f74a91(deserializer=0x0000000000000000) at _common.rs:560 frame #2: 0x00005555556f1016 main`serde_json::de::from_trait::hf804f873e5d11cd2(read=<unavailable>) at de.rs:2386:22 frame #3: 0x00005555556f1227 main`serde_json::de::from_str::haf5c4f009eaf1615(s=(data_ptr = "{\"@type\":\"updateOption\",\"name\":\"version\",\"value\":{\"@type\":\"optionValueString\",\"value\":\"1.7.0\"},\"@client_id\":1}", length = 110)) at de.rs:2586:5

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

antuan- Автор вопроса
Ivan Boldyrev
Какие вызовы в стеке, если запустить с gdb?

разбить это? impl<'de> Deserialize<'de> for TdType { fn deserialize<D>(deserializer: D) -> Result<TdType, D::Error>

antuan- Автор вопроса
Alexander Karaev
я бы посоветовал уменьшать количество вариантов и ...

в общем уменьшить кол-во вариантов нельзя. но если уменьшить для тестирования и оставить только тот, который матчится конкретно для этого сообщения - всё ок

antuan
в общем уменьшить кол-во вариантов нельзя. но если...

> проверял, если уменьшить кол-во вариантов в match, то паника уходит я про это

antuan
в общем уменьшить кол-во вариантов нельзя. но если...

Окей, а попробуй запусти то же самое, но в релизе и проверь, уйдет ли переполнение.

antuan- Автор вопроса
Alexander Karaev
> проверял, если уменьшить кол-во вариантов в matc...

а, я понял, не обязательно матчить ж... ок, попробую

antuan- Автор вопроса
Mikail Bagishov
Окей, а попробуй запусти то же самое, но в релизе ...

там херова гора типов, подождем до вечера, пока соберется :)

antuan- Автор вопроса
antuan
на релизе всё ок

и что это значит?

antuan
и что это значит?

это значит в дебаге генерируется менее эффективный код.

Есть багрепорт с serde и большой структурой, фикс вроде еще не смержили

antuan- Автор вопроса
Mikail Bagishov
Тут serde-derive не задействован

задействован. для вложенных структур. его нет только на верхнеуровневом енуме

antuan
задействован. для вложенных структур. его нет толь...

Ну проблема то явно в верхнеуровневом енуме.

antuan- Автор вопроса
Mikail Bagishov
Ну проблема то явно в верхнеуровневом енуме.

99% - да... ну ок, попробую поразбивать на функции, спасибо

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Кто-нибудь решал проблему с автоматическим скроллингом к выбранной ячейке в TDBGrid в Lazarus? Проблема в том, что есть допустим 3 столбца, третий столбец виден наполовину, вк...
Дмитрий Логинов
1
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
19
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Чорт! Чорт! Чорт! Стала ставить через GetIt (написано же, что ручками не рекомендуется) Сломалось на дублировании моей TSkLabel. Чтож мне ее по всем проектам переименовывать в...
Катерина Свиридова
7
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
Hey someone plz help to resolve my issue here is my table... Log { id user_id type target_ct target_obj_id action_ct action_obj_id workspace_id created_at } i wanna fil...
Rahul Singh
1
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
Карта сайта