Recommended Reading
10 Minutes
React Native Debugging: Tools, Steps, and Common Issues
Fix Bugs Faster! Log Collection Made Easy
React Native debugging poses particular challenges due to the framework’s cross-platform codebase, which combines JavaScript and native platform components. However, an effective React debugging regime will enable you to proactively fix issues in both production and development.
Today’s post will give you the fundamentals to build that regime, showing you:
- How to adopt a clear, step-by-step debugging workflow.
- How to use the built-in React Native debugging tools.
- How to utilize individual tools when the built-in tools aren’t sufficient.
Want to jump to a specific bit of knowledge? Here’s the full list of contents.
Table of Contents
- What debugging React Native apps entails
- Common React Native debugging issues
- How to debug React Native
- Best debugging tools for React Native
- To sum up
- FAQs about debugging React Native
- Why is React Native debugging slower or laggy?
- Why do breakpoints not trigger in React Native DevTools?
- What should we do if a bug cannot be reproduced locally?
- How do we handle intermittent or random bugs?
- Why does Fast Refresh not apply changes correctly?
- Can we debug React Native without running the app?
What debugging React Native apps entails
React Native debugging is about identifying and rectifying issues across both the JavaScript and native iOS/Android layers of an application, using tools to inspect code execution, UI rendering, network activity, performance, and crashes.
While the hybrid nature of the React Native codebase does present challenges, you will be able to rectify most issues if you master these six disciplines:
- Inspect app behavior using logs, DevTools, and error overlays.
- Trace state, props, and component rendering issues.
- Monitor network requests and API responses.
- Test on real devices to catch environment-specific bugs.
- Identify crashes, performance issues, and memory problems.
- Understand differences between development and production builds.
Common React Native debugging issues
React Native issues can vary significantly depending on environment, device, and timing. In general however, the problems usually arise from the particular mix of JavaScript logic, native code, and external systems like APIs.
Here are some common issues to be mindful of:
| Issue | What it looks like |
|---|---|
| App works in emulator but crashes on device | Device-specific errors, permissions, or native modules fail |
| Network requests fail or behave inconsistently | API calls work locally but fail on real devices or production |
| State or props not updating correctly | UI doesn’t re-render or shows outdated data |
| Performance issues and lag | Slow screens, dropped frames, or delayed interactions |
| Native module errors | iOS or Android-specific features break or throw errors |
| Debugging works in dev but not in production | Logs missing, DevTools disabled, issues hard to trace |
| Async bugs and race conditions | Random or inconsistent behavior depending on timing |
| Build or environment differences | Issues caused by configs, dependencies, or OS versions |
Now let’s take a more practical look at React Native debugging.
How to debug React Native
We’ll unpack the various React Native debugging tools later in the article. But before we do that, let’s examine the basic workflow.
Ninety-nine percent of the time, you’ll want to rely on this same five-step process.
- Open the Dev Menu to access debugging options using simulator shortcuts or gestures.
- Inspect the app with React Native DevTools to analyze components, state, logs, and behavior.
- Identify issues with LogBox, React Native’s built-in error reporting and warning interface, to surface warnings and crashes directly in the app.
- Test on a real device to catch issues that don’t appear in the emulator.
- Use additional tools when needed to extend debugging with deeper inspection, state tracking, native analysis, or real-device logging.
This process is not strictly linear though. Depending on the issue, steps can be combined or revisited to isolate the root cause faster.
The React Native Dev Menu is the starting point for debugging in React Native during development.
It lets us access the DevTools, reload options, and debugging settings, and it’s typically our first port of call when investigating an issue locally.
How to open the Dev Menu:
- iOS Simulator: press
Cmd + DorCtrl + Cmd + Z. - Android Emulator: press
Cmd + M(Mac) orCtrl + M(Windows/Linux). - Real device: shake the device.
- Android alternative: run
adb shell input keyevent 82.
Once opened, we can move into the actual debugging tools and start inspecting the app.
Note that the Dev Menu is only available in development builds and is disabled in production.
2. Inspect the app with React Native DevTools
React Native DevTools is the framework’s built-in debugger, having replaced the older Chrome debugging workflow in 2024.
It’s specifically designed to examine how the JavaScript side of your app runs during development, enabling us to inspect UI behavior, state, logs, network activity and execution flow in one place.
| Aspect | Details |
|---|---|
| Features | Inspect components and state, view logs, set breakpoints, analyze network and performance |
| Best for | Debugging UI behavior, component state, and JavaScript execution |
| Limitations | Disabled in production, limited native visibility, requires debug mode |
| When to use it | When reproducing issues locally and inspecting behavior step by step |
How to access React Native DevTools
After opening the Dev Menu, select Open DevTools or press j in the CLI while the app is running.
Reproduce the issue once DevTools is open, then select the panel that’s most appropriate to the problem:
- Console – errors, warnings, and unexpected values or logs.
- Components – props passed to components, state changes, and rendering behavior.
- Sources – breakpoints, call stack, and execution flow step by step.
- Network – failed requests, response data, headers, and timing issues.
- Performance – slow renders, dropped frames, and heavy operations.
If the cause becomes clear, apply the fix and test again.
If not, move to LogBox, test on a real device, or switch to additional tools depending on what you observe.
Pause execution with breakpoints or debugger
If you want to pause execution at a specific line, you can do so by opening the Sources panel in React Native DevTools and setting a breakpoint.
- Open a file from the sidebar or press
Cmd + P/Ctrl + P. - Select the file and click on the line where you want to pause.
- A marker appears, indicating the breakpoint is active.
- Reproduce the issue so execution stops at that line.
The debugger; statement fulfils broadly the same role, only you add it directly to your source code rather than setting it in DevTools (note that breakpoints only trigger when DevTools is open and the app runs in development mode).
- Add
debugger;to the code. - Save the file and let Fast Refresh update the app.
- Trigger the code path so execution pauses automatically.
Once paused, you can use the DevTools controls to step through execution or resume the app.
3. Identify issues with LogBox
The sole role of LogBox is to display errors and warnings in React Native apps as soon as they occur. It’s been turned on by default in every iteration of React Native since 2020.
Here’s a brief rundown of the various LogBox messages, and what to do about them.
| LogBox message | What to do |
|---|---|
TypeError: undefined is not an object | Check whether a variable or prop is missing or not initialized |
Cannot read property 'x' of undefined | Verify data exists before accessing it (API response, state, props) |
Warning: Each child in a list should have a unique "key" | Add a unique key prop when rendering lists |
Possible unhandled promise rejection | Add error handling (try/catch or .catch) for async code |
Network request failed | Check API URL, device connection, or emulator networking |
Require cycle warning | Review imports to avoid circular dependencies |
| Red screen with stack trace | Follow the file and line number to locate the exact issue |
Note that fatal errors will keep LogBox on screen until the issue is fixed, either through Fast Refresh or after a manual reload.
If the cause isn’t clear from the message, continue debugging with DevTools or another tool to inspect the issue further.
4. Test on a real device
Some React Native issues will only appear on a physical device. An app may work correctly in the simulator or emulator, then fail because of network conditions, permissions, hardware behavior, OS differences, or native modules.
To rule out these device-specific issues, run the app on a real iPhone or Android device and repeat the same steps that triggered the problem in the simulator or emulator. This helps determine whether the issue is specific to real-world hardware or affects the app more broadly.
Focus on issues like:
- Camera, microphone, GPS, notifications, or biometric features.
- API calls that fail only on mobile data or a local network.
- Layout problems tied to screen size, text scaling, or device settings.
- Performance issues, lag, or memory pressure not visible in the emulator.
5. Use additional tools when needed
Some issues go beyond what the built-in tools can pick up.
Complex state and data flow problems may require deeper inspection, while native behavior and platform-specific issues typically require lower-level analysis. Performance bottlenecks require profiling and resource monitoring, while device-specific or production-only bugs require real-world context.
When you run into problems like this, or simply need more context, specialized tools can give you deeper visibility into specific parts of the app. In practice, you’ll often require multiple tools rather than a single one.
Now let’s look at those tools in detail.
Best debugging tools for React Native
Here are some of the most popular debugging tools for React Native. Each fulfils a very specific role.
| Tool | What it does |
|---|---|
| Reactotron | Debug state, actions, API calls, and async flows in real time. |
| Radon IDE | Integrated debugging environment tailored for React Native workflows. |
| Native tools (Xcode, Android Studio) | Debug platform-specific issues, crashes, and native modules. |
| Bugfender (remote logging tool) | Capture logs and behavior from real devices and production environments. |
Reactotron

Reactotron is a desktop debugging tool designed to inspect state, actions, and network activity in React Native applications.
How to use it:
- Install Reactotron on your machine.
- Add the Reactotron configuration to your project.
- Start the Reactotron app.
- Run your React Native app and connect it.
| Aspect | Details |
|---|---|
| Features | Inspect state changes, track actions, monitor API requests, view logs. |
| Best for | Debugging state management, actions, and API/data flow. |
| Limitations | Requires setup and code integration, not plug-and-play, limited native debugging. |
| When to use it | When state changes or async behavior are unclear during development. |
Radon IDE

Radon IDE is a development and debugging extension that integrates directly into editors like VS Code, creating a more complete React Native debugging environment.
How to use it:
- Install the Radon IDE extension in your editor.
- Open your React Native project.
- Launch your app from the IDE.
- Use built-in panels to inspect, debug, and interact with the app.
| Aspect | Details |
|---|---|
| Features | Integrated debugger, component inspection, device controls, logs, state and render visualization. |
| Best for | Debugging workflows directly inside the development environment. |
| Limitations | Requires setup and extension install, may overlap with other tools, not focused on production debugging. |
| When to use it | When you want to inspect and debug without switching between tools. |
Bugfender

It feels fair to mention our own tool, Bugfender, here.
Bugfender is a remote logging tool that collects logs and context directly from real devices, including production environments.
How to use it:
- Install the Bugfender SDK for React Native: https://bugfender.com/platforms/react-native/.
- Initialize Bugfender in your app with your API key.
- Add logs in your code where needed.
- View logs and user sessions in the Bugfender dashboard.
| Aspect | Details |
|---|---|
| Features | Remote log collection, user session tracking, device context, real-time log streaming. |
| Best for | Debugging issues on real devices and in production environments. |
| Limitations | Requires SDK integration, not a step-by-step debugger like DevTools. |
| When to use it | When issues cannot be reproduced locally or only occur for real users. |
To sum up
Most React Native bugs are not hard to fix. They are hard to see.
Local tools help inspect behavior step by step, but many issues only appear with real devices, user data, or production conditions.
The faster we move from guessing to observing, the more predictable debugging becomes.
FAQs about debugging React Native
Why is React Native debugging slower or laggy?
Debug mode adds overhead and runs code differently, so performance is slower than production and not always representative.
Why do breakpoints not trigger in React Native DevTools?
Breakpoints only work in development with DevTools open. They fail if the code isn’t reached, the file isn’t mapped correctly, or the app wasn’t refreshed.
What should we do if a bug cannot be reproduced locally?
The issue likely depends on real device conditions, user data, or environment differences. Focus on reproducing it outside the local setup.
How do we handle intermittent or random bugs?
They are usually caused by async behavior or race conditions. Try to reproduce them consistently and isolate what changes between runs.
Why does Fast Refresh not apply changes correctly?
Fast Refresh may not fully reload state or dependencies. A manual reload is often needed to reflect all changes.
Can we debug React Native without running the app?
No. Debugging requires the app to run so behavior, state, and interactions can be observed in real time.
Expect The Unexpected!
Debug Faster With Bugfender