Skip to content

Recommended Reading

React Native Debugging: Tools, Steps, and Common Issues

10 Minutes

React Native Debugging: Tools, Steps, and Common Issues

Fix Bugs Faster! Log Collection Made Easy

Get started

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.

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:

IssueWhat it looks like
App works in emulator but crashes on deviceDevice-specific errors, permissions, or native modules fail
Network requests fail or behave inconsistentlyAPI calls work locally but fail on real devices or production
State or props not updating correctlyUI doesn’t re-render or shows outdated data
Performance issues and lagSlow screens, dropped frames, or delayed interactions
Native module errorsiOS or Android-specific features break or throw errors
Debugging works in dev but not in productionLogs missing, DevTools disabled, issues hard to trace
Async bugs and race conditionsRandom or inconsistent behavior depending on timing
Build or environment differencesIssues 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.

  1. Open the Dev Menu to access debugging options using simulator shortcuts or gestures.
  2. Inspect the app with React Native DevTools to analyze components, state, logs, and behavior.
  3. Identify issues with LogBox, React Native’s built-in error reporting and warning interface, to surface warnings and crashes directly in the app.
  4. Test on a real device to catch issues that don’t appear in the emulator.
  5. 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.

1. Open the Dev Menu

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 + D or Ctrl + Cmd + Z .
  • Android Emulator: press Cmd + M (Mac) or Ctrl + 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.

AspectDetails
FeaturesInspect components and state, view logs, set breakpoints, analyze network and performance
Best forDebugging UI behavior, component state, and JavaScript execution
LimitationsDisabled in production, limited native visibility, requires debug mode
When to use itWhen 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 messageWhat to do
TypeError: undefined is not an objectCheck whether a variable or prop is missing or not initialized
Cannot read property 'x' of undefinedVerify 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 rejectionAdd error handling (try/catch or .catch) for async code
Network request failedCheck API URL, device connection, or emulator networking
Require cycle warningReview imports to avoid circular dependencies
Red screen with stack traceFollow 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.

ToolWhat it does
ReactotronDebug state, actions, API calls, and async flows in real time.
Radon IDEIntegrated 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 documentation page showing the Quick Start for React Native, with installation instructions and a screenshot of the Reactotron desktop app event timeline.

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.
AspectDetails
FeaturesInspect state changes, track actions, monitor API requests, view logs.
Best forDebugging state management, actions, and API/data flow.
LimitationsRequires setup and code integration, not plug-and-play, limited native debugging.
When to use itWhen state changes or async behavior are unclear during development.

Radon IDE

Radon IDE homepage showing its React Native and Expo development environment, including VS Code integration, code editor, and a live mobile app preview for debugging and development.

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.
AspectDetails
FeaturesIntegrated debugger, component inspection, device controls, logs, state and render visualization.
Best forDebugging workflows directly inside the development environment.
LimitationsRequires setup and extension install, may overlap with other tools, not focused on production debugging.
When to use itWhen you want to inspect and debug without switching between tools.

Bugfender

Bugfender homepage highlighting its remote logging and bug monitoring platform, with a dashboard preview showing application logs, crashes, issues, and connected devices for debugging production apps.

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.
AspectDetails
FeaturesRemote log collection, user session tracking, device context, real-time log streaming.
Best forDebugging issues on real devices and in production environments.
LimitationsRequires SDK integration, not a step-by-step debugger like DevTools.
When to use itWhen 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

Start for Free
blog author

Aleix Ventayol

Aleix Ventayol is CEO and co-founder of Bugfender, with 20 years' experience building apps and solutions for clients like AVG, Qustodio, Primavera Sound and Levi's. As a former CTO and full-stack developer, Aleix is passionate about building tools that solve the real problems of app development and help teams build better software.

Join thousands of developers
and start fixing bugs faster than ever.