Sign in Join
Wiki copytemporary

Debugger Console App: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Introduction
22
33This page contains information on how to debug console applications in Lazarus. That is where to find the output (writeln) of your app, and where to type the input (readln).
44
55This page was written for Lazarus 0.9.30 and above.
66
77## Windows
88
9-On Windows, the application will open its own console window, just as it would outside the debugger. There is no need to do anything special apart from adding a `ReadLn;` before the application terminates so that the console window does not automatically close until you press <span class="kbd">Enter</span>.
9+On Windows, the application will open its own console window, just as it would outside the debugger. There is no need to do anything special apart from adding a `ReadLn;` before the application terminates so that the console window does not automatically close until you press `Enter`.
1010
1111## Linux
1212
1313### Lazarus 0.9.30 / 0.9.30.2
1414
1515Please see the notes in the#Mac section.
1616
1717### Lazarus 0.9.31 / 1.0 and higher
1818
1919You can open a console window from the menu: "View" =\> "Debug Windows" =\> "Terminal Output"
2020
2121It shows the raw output of your application. Note it has no support for any escape sequences, as some terminals may have. Anything you type into this window will be sent to your application.
2222
2323## Mac & Linux
2424
2525Unfortunately there is currently no built-in support for debugging console applications.
2626
2727Console applications do not have their own terminal, but use the terminal they were started from (the terminal of the shell they were started from). When started from within Lazarus, there is no such terminal. You can specify a "starter application" (like xterm) under menu "Run" =\> "Run parameters". however this only works if you start your application without a debugger. **This does not work for debugging.**
2828
2929There are a couple of workarounds.
3030
3131### Redirect output to file
3232
3333In menu "Run" =\> "Run parameters": specify in "command line parameters":
3434
3535` >/somedir/somefile`
3636
3737Then outside Lazarus open a shell and run
3838
3939``` bash
4040tail -f /somedir/somefile
4141```
4242
4343### Redirect input and output to a pty (terminal)
4444
4545Open a terminal outside of Lazarus and run
4646
4747```bash>
4848pty
4949</syntaxhighlight>
5050On Ubuntu 18, the command is
5151<syntaxhighlight lang=
5252```
5353
5454tty
55-
56-</syntaxhighlight>
5755
5856It should return something like
5957
6058` /dev/pty/2`
6159
6260The exact value depends on the OS and the number of terminals already open.
6361
6462Note
6563The returned value is only valid as long as the terminal stays open, so if you open a new terminal next time you debug in Lazarus, you need to adapt all settings to the new value.
6664
6765In menu "Run" =\> "Run parameters": specify in "command line parameters":
6866
6967` >/dev/pty/2 </dev/pty/2`
7068
7169If you want to use the terminal to send input to your application, then you may need to stop the shell in it from reacting to the input (unless you started a terminal without a shell). Run something like
7270
7371``` bash
7472tail -f /some/empty/file/that/does/not/change
7573```
7674
7775> **Note:** This means you still can't use ctrl-c in the input.
7876
7977#### Debugger startup options
8078
8179In the global options dialog, on the debugger page, you can specify parameters given to **gdb** (do ***not*** use the in/output redirect **\>** or **\<** here, which is meant for interactive **bash** but use something like **--args**).
8280
8381It may be possible to specify the **pty** here, but there is currently no further info.
8482
8583### gdbserver
8684
8785Use the gdbserver based debugger. You can start gdbserver on the same computer as the IDE. Run gdbserver inside the terminal that you want to use for your stdout/stdin
8886
8987### Lazarus 0.9.31
9088
9189In the global options dialog, on the debugger page is an entry "ConsoleTty". You can enter the result of "pty" here. Then you do not need to specify any **\<** or **\>** redirects.
9290
9391### Lazarus 2.x with LLDB on macOS aarch64
9492
9593In the global options dialog, on the debugger page there is a "LaunchNewTerminal" option when **LLDB** is selected (currently the only option for this platform).
9694
9795However if you tick that without making the following prerequisites, **lldb** (and thus Lazarus) will freeze.
9896
99971, First of all, check that your **terminal shell** is listed in the **/etc/shells** file.
10098
10199You can check your current shell by this command:
102100
103101``` bash
104102echo $SHELL
105103```
106104
107105And list the current contents of this file by this command:
108106
109107``` bash
110108cat /etc/shells
111109```
112110
113111If you installed your shell e.g. via Homebrew, your shell is probably not on the list. In this case you can add it manually, to make the following commands will work.
114112
115113If you have to edit this file, **be extremely cautious**, and do it **on your own risk**! You have been noticed!
116114
1171152, (Optional step) If you use different terminal emulator than the default one, you can test the following command.
118116
119117``` bash
120118osascript -e "tell application \"Terminal\" to do script \"echo lazarus\""
121119```
122120
123121The system protection dialog should pop-up, about do you allow xy application to control the terminal. You should answer yes, and check that the freshly popped-up built-in terminal app writes "lazarus".
124122
1251233, Open Lazarus. Define a new external tool in the Tools menu, with the program of **/bin/sh** and the following parameters.
126124
127125``` bash
128126-c 'osascript -e "tell application \"Terminal\" to do script \"echo lazarus\""'
129127```
130128
131129After you've added the tool, restart Lazarus, and click on it. The same system protection dialog will pop up, but for Lazarus now. Say yes, to allow it.
132130
133131After doing these prerequsities, you can safely tick the "LaunchNewTerminal" option in the global settings, and every time you start a debugging, you can control stdin/stdout of the debugged program in a separate terminal window.
134132
135133Note: Debugging will be really, really, really slow, unless you add the dedicated Debug/Release modes to your project, and use the Debug one for debugging. Use Dwarf2 symbols at the moment when possible.
136134
137135## See also
138136
139137- [[GDB Debugger Tips|General tips/info on debugging]]
140138
141139---
142140*From the Free Pascal wiki, page "Debugger Console App", as it stood on 2023-06-18 after a change by Shaglonux, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
143141Category: Debugging
144142Category: Lazarus

Back to history