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

23 просмотра

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта