| --- |
| title: Troubleshooting |
| sidebar_position: 10 |
| id: troubleshooting |
| license: | |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --- |
| |
| This page covers common issues and debugging techniques for Apache Fory™ Rust. |
| |
| ## Common Issues |
| |
| ### Type Registry Errors |
| |
| **Error**: `TypeId ... not found in type_info registry` |
| |
| **Cause**: The type was never registered with the current `Fory` instance. |
| |
| **Solution**: Register the type before serialization: |
| |
| ```rust |
| let mut fory = Fory::default(); |
| fory.register::<MyStruct>(100)?; // Register before use |
| ``` |
| |
| Confirm that: |
| |
| - Every serializable struct or trait implementation calls `fory.register::<T>(type_id)` |
| - The same IDs are reused on the deserialize side |
| |
| ### Type Mismatch Errors |
| |
| **Cause**: Field types are incompatible or schema has changed. |
| |
| **Solution**: |
| |
| - Enable compatible mode for schema evolution |
| - Ensure field types match across versions |
| |
| ```rust |
| let fory = Fory::default().compatible(true); |
| ``` |
| |
| ## Debugging Techniques |
| |
| ### Enable Panic on Error for Backtraces |
| |
| Toggle `FORY_PANIC_ON_ERROR=1` alongside `RUST_BACKTRACE=1` to panic at the exact site an error is constructed: |
| |
| ```bash |
| RUST_BACKTRACE=1 FORY_PANIC_ON_ERROR=1 cargo test --features tests |
| ``` |
| |
| Reset the variable afterwards to avoid aborting user-facing code paths. |
| |
| ### Struct Field Tracing |
| |
| Add the `#[fory(debug)]` attribute alongside `#[derive(ForyObject)]` to emit hook invocations: |
| |
| ```rust |
| #[derive(ForyObject)] |
| #[fory(debug)] |
| struct MyStruct { |
| field1: i32, |
| field2: String, |
| } |
| ``` |
| |
| Once compiled with debug hooks, call these functions to plug in custom callbacks: |
| |
| - `set_before_write_field_func` |
| - `set_after_write_field_func` |
| - `set_before_read_field_func` |
| - `set_after_read_field_func` |
| |
| Use `reset_struct_debug_hooks()` when you want the defaults back. |
| |
| ### Lightweight Logging |
| |
| Without custom hooks, enable `ENABLE_FORY_DEBUG_OUTPUT=1` to print field-level read/write events: |
| |
| ```bash |
| ENABLE_FORY_DEBUG_OUTPUT=1 cargo test --features tests |
| ``` |
| |
| This is especially useful when investigating alignment or cursor mismatches. |
| |
| ### Inspect Generated Code |
| |
| Use `cargo expand` to inspect code generated by Fory derive macros: |
| |
| ```bash |
| cargo expand --test mod $mod$::$file$ > expanded.rs |
| ``` |
| |
| ## Running Tests |
| |
| ### Run All Tests |
| |
| ```bash |
| cargo test --features tests |
| ``` |
| |
| ### Run Specific Test |
| |
| ```bash |
| cargo test -p tests --test $test_file $test_method |
| ``` |
| |
| ### Run Test with Debugging |
| |
| ```bash |
| RUST_BACKTRACE=1 FORY_PANIC_ON_ERROR=1 ENABLE_FORY_DEBUG_OUTPUT=1 \ |
| cargo test --test mod $dir$::$test_file::$test_method -- --nocapture |
| ``` |
| |
| ## Test-Time Hygiene |
| |
| Some integration tests expect `FORY_PANIC_ON_ERROR` to remain unset. Export it only for focused debugging sessions: |
| |
| ```bash |
| # For specific debugging only |
| FORY_PANIC_ON_ERROR=1 cargo test -p tests --test specific_test -- --nocapture |
| |
| # Normal test run (without panic on error) |
| cargo test --features tests |
| ``` |
| |
| ## Error Handling Best Practices |
| |
| Prefer the static constructors on `fory_core::error::Error`: |
| |
| - `Error::type_mismatch` |
| - `Error::invalid_data` |
| - `Error::unknown` |
| |
| This keeps diagnostics consistent and makes opt-in panics work correctly. |
| |
| ## Quick Reference |
| |
| | Environment Variable | Purpose | |
| | ---------------------------- | ----------------------------------- | |
| | `RUST_BACKTRACE=1` | Enable stack traces | |
| | `FORY_PANIC_ON_ERROR=1` | Panic at error site for debugging | |
| | `ENABLE_FORY_DEBUG_OUTPUT=1` | Print field-level read/write events | |
| |
| ## Related Topics |
| |
| - [Configuration](configuration.md) - Fory options |
| - [Type Registration](type-registration.md) - Registration best practices |
| - [Schema Evolution](schema-evolution.md) - Compatible mode |