Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Work out plan to move community to direct debugging #206

Open
acoates-ms opened this issue Feb 24, 2020 · 15 comments
Open

Work out plan to move community to direct debugging #206

acoates-ms opened this issue Feb 24, 2020 · 15 comments
Labels
🗣 Discussion This label identifies an ongoing discussion on a subject

Comments

@acoates-ms
Copy link
Collaborator

acoates-ms commented Feb 24, 2020

Introduction

Various upcoming react-native features are going to start requiring that developers debug JS directly against the JS engine running on the device instead of remote JS debugging (or web debugging) that is commonly used today. This includes TurboModules and Fabric, which do not work unless the JS is running on device. In addition even without using these things code has been slowly diverging between web debugging, and direct debugging. (View Configs being an obvious example).

We need to work out a transition plan to move people away from using web debugging, and to start using direct debugging.

Discussion points

How can we identify what are the current blocking issues preventing people from using direct debugging?

How can we encourage people to use direct debugging instead of web debugging?

Web debugging already causes warnings in view configs - should we have an additional more explicit warning, maybe with instructions on how to direct debug instead?

When can we remove web debugging?

We probably wont know for sure until we get a better sense of what gaps currently exist, but could it be marked as deprecated in 0.63, then removed in 0.64? Is that too quick?

@kelset kelset added the 🗣 Discussion This label identifies an ongoing discussion on a subject label Feb 24, 2020
@kelset
Copy link
Member

kelset commented Feb 24, 2020

Thanks for opening this discussion @acoates-ms!

So, I think that there was a sort-of similar conversation started almost 2 years ago by @axe-fb -> #7

I think that the main "broad community" reason for using the web debugging is just "ease of use" - if I'm understanding what you mean with web VS device. Just to make sure: if I'm debugging an app installed in the simulator does that fall in the web debugging part? What if I'm using Flipper?

We probably wont know for sure until we get a better sense of what gaps currently exist, but could it be marked as deprecated in 0.63, then removed in 0.64? Is that too quick?

Sorry, need to ask clarification question about this too. Basically you are envisioning to deprecate the "Remote Debugging" button from the dev menu when in debug mode for a RN app?

@elicwhite
Copy link

cc @rickhanlonii, as I believe he is working on bringing the Hermes Debugger to Flipper which should make it easy to debug on Android for people using Hermes. I'm not sure if there are plans for iOS though.

Also cc @RSNara and @hramos as TurboModules rolling out will be the forcing function that will make the Chrome Proxy Debugger no longer work. We'll need to have a plan to get people off of that.

@slorber
Copy link

slorber commented Feb 25, 2020

Hi,

I'm a heavy user of the Chrome debugger.

Not totally sure what you mean by "direct debugging", except maybe that the JS runs on the phone and not in Chrome.

Can we do direct debugging today easily?
Is there an article to explain how to set this up and give it a try?
Does Flipper allow direct debugging?

@terrysahaidak
Copy link

I'm and lots of folks from my company (as well as 1,167,438 installs on vs-marketplace) are addicted to VSCode debugger and React Native Tools. Direct debugging is going to break such an excellent and easy DX.

I've been avoiding Chrome debugging (as well as all the all-in-one solutions where it also has React Devtools and redux Devtools) because it's just hard to use, it slow to load source maps, I've been constantly switching context from VSCode to chrome and back, Chrome in the background runs the app slower, etc.
console.log was my favorite debug thing.

But everything has changed once I tried React Native Tools and debugger just inside the VSCode. It's just as much convenient as using Android Studio or XCode to debug native code.

Direct debugging is such a big step back here.

I didn't find an answer yet. I know we cannot use the Chrome Debug Protocol anymore. But maybe we can start thinking about something that can replace it and provide some interface to VSCode as Chrome Debug Protocol did?

@axe-fb
Copy link
Collaborator

axe-fb commented Feb 25, 2020

One of the original authors of the VSCode Extension here.
The VSCode debugger (and the React Native extension) is actually using the same mechanism as the Chrome debugger, except it runs the code on Node instead of Chrome. Thats one reason why source maps faster.
Hermes uses the Chrome Debug Protocol, and VSCode does understand that. I am assuming that moving VSCode extension to use Direct DEbugging is easy. Given the protocol, other debugging clients may also be able to connect.
Also, I think direct debugging is better than where we are today, mostly because you are debugging on the JS engine that the code will run on - ensuring that JS differences between engines dont hurt us.

@kelset
Copy link
Member

kelset commented Feb 25, 2020

Can it maybe be clarified what "Direct Debugging" is? It really feels like it'd help a lot to make sure we all are well aware of what it is VS Web Debugging.

@terrysahaidak
Copy link

In my understanding, direct debugging is the debug process when you connect to the VM itself - for example, the way we debug web view on Android using remote devices menu in devtools.

Is direct debugging forces us to use that approach (the same for iOS using Safari) or it's just the term which represents the way it's going to work under the hood, so we will be able to workaround everything and connect directly to VM from VSCode or Flipper plugin.

@acoates-ms
Copy link
Collaborator Author

Sorry, obviously I needed to flush out what I meant by direct debugging.

I'm referring to attaching to the JS engine which is running on the device. Hermes, and V8 certainly support the Chome Debug Protocol, which means you would be able to attach either VSCode, or Chrome directly to your device. The JS is still running on the device, so turbo modules and other things that rely on native JS function hooks, JSI, or synchronous native modules continue to work.

This is different than the remote JS debugging where the JS runs in chrome (or VSCode).

I think direct debugging should be relatively trivial to get to work today with Android. I'm less clear where iOS stands. My understanding is that the only mechanism to do this with the built in JSC is to use Safari debugging. -- which I gather is a less pleasant devX.

What I was envisioning is that in addition to the Remote JS option in the debug menu currently, there would be an option to put the JS engine in to debug mode, which would allow any Chrome Debug Protocol compatible debugger to attach. (VSCode, chrome etc). (In react-native-windows we've supported direct debugging for ages, but I'm in the process of making it more discoverable by adding it to the debug menu there too)

At the very least we need to start getting the experience of direct debugging to be as good or better than the remote JS debugging, so that its not another blocker / shock when people try to start using turbomodules.

@terrysahaidak
Copy link

What about using a tool to proxy Chrome Devtools Protocol to JSC?

Few of them:
https://github.com/google/ios-webkit-debug-proxy
https://github.com/RemoteDebug/remotedebug-ios-webkit-adapter

@usrbowe
Copy link

usrbowe commented Apr 7, 2020

@terrysahaidak I tried to use the one from Microsoft (it's built on top of work from Google), but can't seem to proxy JSCore. Only works with Safari. Maybe need to do some change in RN code. But I have feeling we might not need a proxy as we already have a metro running the Chrome Debugger Protocol proxy. It's done for Hermes debugger.
So maybe can reused metro and try to expose JSCore.

mergify bot pushed a commit to celo-org/celo-monorepo that referenced this issue Jan 27, 2021
…on (#6488)

### Description

This PR enables Flipper on iOS along with `Redux Debugger` and `Reactotron` plugins.

This allows viewing / debugging the following:
- React DevTools (Components and Profiling)
- Network connections
- View hierarchy
- Redux State / Actions
- AsyncStorage
- App preferences
- Hermes
- and more ;)

It also opens the door for creating/adding our own Flipper plugins (for instance for viewing transactions 😉).

Setup instructions were added to the mobile README.

### Details

When we upgraded to React Native 0.63.x and Reanimated 2, the introduction of TurboModules broke the ability to use remote debugging with the Chrome DevTools, see [this discussion with more details](react-native-community/discussions-and-proposals#206).

As an alternative we can use Flipper to provide similar debugging functionalities.

Flipper was already working on Android, but on iOS there was a conflict between the OpenSSL lib shipped as part of `react-native-fast-crypto` and the one included by `Flipper`. To workaround this problem, we now use [a "headers" only version of `OpenSSL`](https://github.com/celo-org/OpenSSL-headers) that makes `Flipper` happy while building. 

The 2nd issue was that Flipper in React Native doesn't work with `use_frameworks!` enabled in the `Podfile`, which we need because we have Swift dependencies, which don't work without it.
I bent CocoaPods a little more so that everything Flipper related is built as static frameworks.

I've integrated both `Redux Debugger` and `Reactotron` as they provide different lenses to debug the app.
There's also a `redux-saga` plugin for `Reactotron` but it triggered some odd unhandled promise rejections, so I didn't include it.

While working on this I noticed the state in the `exchange` reducer is very big and made the `Redux Debugger` plugin quite unusable within Flipper. There's an issue open which should address this (#6284). In the meantime I've filtered out that part of the state in `Redux Debugger`. `Reactotron` can still be used to see it and is not affected.

Overall this gives us more tools to see what is happening within the app.

### Tested

- Flipper works on both iOS and Android along with their `Redux Debugger` and `Reactotron` plugins.
- iOS release builds don't include Flipper (Flipper modules are built for release builds, but NOT linked - this makes the build take more time, but unfortunately no simple way around this with CocoaPods for now, or we'd need to manage multiple `Podfile.lock` files, see facebook/flipper#1275).

<img width="1554" alt="Screenshot 2021-01-15 at 11 38 52" src="https://user-images.githubusercontent.com/57791/104722566-4bfe4800-572e-11eb-973c-63c7af58b94f.png">
<img width="1554" alt="Screenshot 2021-01-15 at 11 39 19" src="https://user-images.githubusercontent.com/57791/104722570-4f91cf00-572e-11eb-9bb7-4fe0abf4336c.png">
<img width="1554" alt="Screenshot 2021-01-15 at 12 30 47" src="https://user-images.githubusercontent.com/57791/104722693-836cf480-572e-11eb-8ef0-83e54a52dfe8.png">
<img width="1554" alt="Screenshot 2021-01-15 at 11 40 26" src="https://user-images.githubusercontent.com/57791/104722580-5587b000-572e-11eb-886e-8fff2da8cffd.png">
<img width="1554" alt="Screenshot 2021-01-15 at 11 40 48" src="https://user-images.githubusercontent.com/57791/104722594-5a4c6400-572e-11eb-86bd-873add6027b1.png">
<img width="1554" alt="Screenshot 2021-01-15 at 11 47 17" src="https://user-images.githubusercontent.com/57791/104722632-6801e980-572e-11eb-8412-d86a8a29d383.png">
<img width="1554" alt="Screenshot 2021-01-15 at 11 49 12" src="https://user-images.githubusercontent.com/57791/104722649-6df7ca80-572e-11eb-8ac5-bae41abd6488.png">
<img width="1554" alt="Screenshot 2021-01-15 at 11 49 32" src="https://user-images.githubusercontent.com/57791/104722659-7223e800-572e-11eb-9734-59512f3987f9.png">

### Related issues

- Discussed on Slack: https://celo-org.slack.com/archives/CL7BVQPHB/p1610040529072600

### Backwards compatibility

Yes
@mjmasn
Copy link

mjmasn commented Nov 8, 2021

What's the latest on this? With React Native 0.66 we have to upgrade to Reanimated 2 which breaks chrome debugger debugging for JSC (due to Turbomodules). In theory we can switch to Hermes and use Flipper on Android but on iOS we can't because the Salesforce SDK we're using requires use_frameworks! and Hermes is not compatible with use_frameworks!. But then we'd be using different engines for each platform with all the fun that entails.

Is there currently any way to debug JSC directly for either iOS or Android? Preferably on both real devices and simulator/emulator.

@terrysahaidak
Copy link

@mjmasn you can debug JSC with Safari directly running on a simulator or device. Also, you can debug Hermes the same way. With Hermes, it's even easier since now you can actually debug it inside VSCode. There is experimental support for JSC so you can give it a try as well.

@matt-oakes
Copy link
Member

@terrysahaidak That sounds really interesting. Do you have any details about any VSCode plugins that are required or is the support built in?

@mjmasn
Copy link

mjmasn commented Nov 8, 2021

@terrysahaidak thanks for the reply, with simulator yes I can connect with Safari directly. Doesn't seem to work for a real iphone device but maybe I'm doing something wrong? It only seems to list the 2 webviews in the app and the app name itself is greyed out.

Either way we don't seem to have any issues with iOS and chrome debugger which makes me wonder why turbomodules are only causing issues with this on Android...

VSCode support for direct JSC debugging would be awesome - are you referring to this? https://nicedoc.io/microsoft/vscode-react-native#debugging-react-native-applications Not clear if it works for Android too but I will give it a go.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🗣 Discussion This label identifies an ongoing discussion on a subject
Projects
None yet
Development

No branches or pull requests

10 participants