Very kind of you Hayder, thanks. Your question is interesting — I will try to give a clear answer!
Jupytext’s purpose is to represent Jupyter notebooks as text, as either Markdown documents or scripts. Say you choose to save your notebook as a Python script. Then you can edit, run and debug this script in a Python IDE. Setting a breakpoint at any position in the script is easy, right? So indeed this is one way of debugging Jupyter notebooks.
Note that in this approach, the script runs in a different Python process than that of the notebook, and has no access to the variables defined in the notebook.
Now let me comment on the previous post Debug Jupyter notebooks in PyCharm. There, I document how to attach the notebook kernel to PyCharm. With that approach, we access the same python process than in the notebook, and variables do not need to be re-created. There is a limitation, though: breakpoints can only be set on scripts or packages imported in the notebook, not on the notebook itself. Thus, if you want to debug a function in the notebook, you will have first to export the function to a script, import it, set a breakpoint in PyCharm, and call it from the Jupyter notebook.