# Debugging

The following tools are used for debugging the MetaMask mobile app:

- [Flipper](https://fbflipper.com/) - For general debugging on iOS and Android
  - [Redux Debugger](https://github.com/jk-gan/flipper-plugin-redux-debugger) - A plugin in Flipper for debugging Redux
- [Safari Browser](https://github.com/react-native-webview/react-native-webview/blob/master/docs/Debugging.md#debugging-webview-contents) - For debugging the in-app browser for the mobile app
- [Google Chrome](https://github.com/react-native-webview/react-native-webview/blob/master/docs/Debugging.md#debugging-webview-contents) - For debugging the in-app browser for the mobile app

## Flipper Setup

The prerequisite for debugging is to ensure that the mobile app is up and running:

- `yarn watch` - Start the metro bundler, which serves the JS bundle to the native app
- `yarn start:android` or `yarn start:ios`, which builds the app and installs it in the simulator

Run [Flipper](https://fbflipper.com/docs/getting-started/) using `yarn start:flipper` (verified working with v0.263.0)

- May be prompted to install Flipper for first time users
- Flipper app runs in the web browser

- If there are warnings on the `Troubleshoot` tab, follow the `Setup Doctor` to resolve all of the checks

Finally, check that the debugger is working:

- With the Flipper browser tab open, open your simulator alongside the Flipper app
- Flipper will auto-detect the device and the application to debug
- At this point, you should now be able to access features such as `Logs`

To enable Redux debugging: in Flipper, select the `More` tab -> `Plugin` and add [`redux-debugger`](https://github.com/jk-gan/flipper-plugin-redux-debugger)

- If the plugin is disabled, add or enable the plugin
- Once enabled, the plugin automatically picks up Redux actions, which can be used for debugging state changes

## Debugging the WebView (in-app browser)

### Android

- Run the app in debug mode (for example, in a simulator)
- Open Chrome on your desktop
- Go to `chrome://inspect/#devices`
- Look for the device and click inspect

### iOS

- Run the app in debug mode (for example, in a simulator)
- Make sure the value of `webviewDebuggingEnabled` prop on the Webview component is `true`
- Open Safari on your desktop
- Go to the menu Develop -> [Your device] -> [Website]

## Troubleshooting

- Flipper can't find watchman
  - Flipper expects watchman in the `user/local/bin` dir
  - Ex. If `watchman` was installed using `brew`, you may symlink `ln -s /opt/homebrew/bin/watchman /usr/local/bin/watchman`
- IDB binary not found
  - Flipper expects `idb` binary to exist in the path provided to it
  - First, ensure that [`idb`](https://github.com/facebook/idb?tab=readme-ov-file#idb-client) is installed
  - Then update the `idb` binary path in Flipper with the path returned by `which idb`
- Trouble installing `idb` with `pip3.6`
  - An alternative is to use [`pipx`](https://pipx.pypa.io/stable/) to install `idb`
  - Ensure that `pipx` path is added to your terminal's profile file using `pipx ensurepath`
- `Flipper` not detecting open simulator when `Flipper` is started
  - Try both refreshing the web page and the simulator
- Simulators not found and/or an error appearing under simulators showing command failed for `idb list-targets --json`
  - This is an open issue regarding M1 devices experiencing this issue
  - Try creating a symlink for `idb_companion` with `sudo ln -s /opt/homebrew/bin/idb_companion /usr/local/bin`