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 ответов

25 просмотров

Какие вызовы в стеке, если запустить с 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% - да... ну ок, попробую поразбивать на функции, спасибо

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта