From 2c77171d1ee9375355ae12ced1985c4262a96866 Mon Sep 17 00:00:00 2001 From: Eric Simpson Date: Fri, 26 Sep 2025 12:54:45 -0400 Subject: [PATCH] debug service overview Signed-off-by: Eric Simpson --- .astro/astro/content.d.ts | 15 +- astro.config.mjs | 12 +- .../debug/{index.mdx => configure.mdx} | 95 +----- .../docs/developing/debug/debugSEPView.png | Bin 0 -> 26229 bytes .../docs/developing/debug/overview.mdx | 272 ++++++++++++++++++ 5 files changed, 295 insertions(+), 99 deletions(-) rename src/content/docs/developing/debug/{index.mdx => configure.mdx} (61%) create mode 100644 src/content/docs/developing/debug/debugSEPView.png create mode 100644 src/content/docs/developing/debug/overview.mdx diff --git a/.astro/astro/content.d.ts b/.astro/astro/content.d.ts index 25296b2..625e4d9 100644 --- a/.astro/astro/content.d.ts +++ b/.astro/astro/content.d.ts @@ -250,9 +250,16 @@ declare module 'astro:content' { collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".mdx"] }; -"developing/debug/index.mdx": { - id: "developing/debug/index.mdx"; - slug: "developing/debug"; +"developing/debug/configure.mdx": { + id: "developing/debug/configure.mdx"; + slug: "developing/debug/configure"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"developing/debug/overview.mdx": { + id: "developing/debug/overview.mdx"; + slug: "developing/debug/overview"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> @@ -596,5 +603,5 @@ declare module 'astro:content' { type AnyEntryMap = ContentEntryMap & DataEntryMap; - export type ContentConfig = typeof import("./../../src/content/config.js"); + export type ContentConfig = typeof import("../../src/content/config.js"); } diff --git a/astro.config.mjs b/astro.config.mjs index 3ca7f45..f428aa2 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -100,7 +100,17 @@ export default defineConfig({ }, { label: 'Debugging', - link: 'developing/debug/', + collapsed: true, + items: [ + { + label: 'Overview', + link: 'developing/debug/overview', + }, + { + label: 'Configuring', + link: 'developing/debug/configure', + } + ] }, { label: 'ILEDocs', diff --git a/src/content/docs/developing/debug/index.mdx b/src/content/docs/developing/debug/configure.mdx similarity index 61% rename from src/content/docs/developing/debug/index.mdx rename to src/content/docs/developing/debug/configure.mdx index 59565a4..f69e95b 100644 --- a/src/content/docs/developing/debug/index.mdx +++ b/src/content/docs/developing/debug/configure.mdx @@ -1,60 +1,8 @@ --- -title: Guide +title: Configuring the debugger --- import { Aside, CardGrid, Card, Icon, Tabs, TabItem } from '@astrojs/starlight/components'; -# ILE Debugging - -Debugging ILE programs is now available inside of Visual Studio Code. We've added UI to make sure setting up the Debug Service to be a swift process. - - - -# Starting to debug - - - - - -After configuring the Debug Service, launching a debug session is a click of a button away. When you have active source open, a new Debug button will appear in the navigation bar. Breakpoints can be set prior to debugging, or during the debugging session. - - - -![](./debug1.png) - - - ---- - - - - - -Clicking the Debug button will display an input box which will allow the user to customise the command which starts the debug job. This allows the developer to pass in parameters, or call another program to launch the debug session. - -After the debug session has started, every session will break on entry. You can read more about the debugging UI on the [Debug actions section on the Visual Studio Code documentation](https://code.visualstudio.com/docs/editor/debugging#_debug-actions). - - - -![](./debug2.png) - - - ---- - - - - - -To debug a program from the Object Browser, right-click on the program object and select the **Debug Program** option. Like before this will also display an input box to modify the command which starts the debug job. - - - -![](./debug3.png) - - - -# Configuring the debugger - ## General requirements * PTFs (see below) @@ -193,44 +141,3 @@ When there are newer Debug service or Navigator/HTTP Group PTFs, the following s - If HTTP Group PTF does not show as applied, IPL might be required. 2. Regenerate debug service trust store (as described above) -# Common issues - -## Debug hangs - -There is a [known issue](https://github.com/codefori/vscode-ibmi/issues/1059) that when you start debugging from VS Code, the debugger hangs and doesn't launch. - -The fix is to check if you've got a prior debug job stuck in `MSGW`. You can do this with `WRKACTJOB`, or a similar command like `WRKSBSJOB QBATCH`. - -**Users should no longer face this issue** as we now submit debug jobs to `QSYSWRK` with `QSYSNOMAX`. - -## `STRDBGSVR` requirement - -The Debug Service that is started depends on the traditional Debug Server. - -![](./error_2.png) - -If you receive this message, do as it says. Simply start the Debug Server with `STRDBGSVR` from a greenscreen. - -## IP not in cert list - -**It is always recommended you use a hostname in the connection settings to make use of the debugger**. - -![](./error_1.png) - -*Error that is shown when connecting to the debugger if connecting using an IP address.* - -This error occurs when the hostname used to connect to the debugger (which might be the IP address that was configured in the connection settings) is not the same as the host name created as part of the certificate. - -If you are using a system that doesn't have a host name (for example `YOURSYSTEM`, or `pub400.com`), then an entry should be added to your device's 'hosts' file. This entry should be the same on all devices in your network to ensure that everyone is using the same hostname. - -* Windows: `c:\Windows\System32\Drivers\etc\hosts` -* Mac: `/etc/hosts` - -Your entry might look like this: - -```txt title="hosts" {2} -# IP HOSTNAME -192.168.0.20 MYIBMI -``` - -If you find that you've added your local hostname entry and the error is still occurring, then you may need to delete the existing certificates from `/QIBM/ProdData/IBMiDebugService/bin/certs` on the IFS and generate them again in the Walkthrough. diff --git a/src/content/docs/developing/debug/debugSEPView.png b/src/content/docs/developing/debug/debugSEPView.png new file mode 100644 index 0000000000000000000000000000000000000000..b57c77b7c227a42bf832439160867f8b041703d3 GIT binary patch literal 26229 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 z zkx0WC<_=KHyMT?^4g(oMg9AwOJJ8D-b$|u`hh?=s1DLI{Ya3mtMq*k>%;_XsGf!1@ z&pVGe8B=XldzUScZ=IcAkxDi5N)7Ho2#%!bhptpm6+rEOmbJ!}7dUANzbA&eUPF22&H8*GA@W^r(7D;EB-QTY$Qz9qO{ z3D|`*XK1wn?|}MS(4<~8$!Gqdw?kt(0FgO5nq2ySNNl$MfufH;p|QI5pD+W3dMc?$ z{lU!v2;%=pl;hA68ih~*-TO~PKqkmBvq~)($OrJZ|Nr&7#zIYwDFW)Z0R4STSo4@1 z-;Kau+V24rD{j`5mC9>3)7v12egT&nwJePS`+wX2-+@G$5DCZO0zRkzDfn+k|F@uQ z`0Qbyro5in@FalNF46;>`~@~KCC;-}UEtMY{`t6>SS5j-NZ>F7H@()}VGEP|=f-|o zn&uCeZrXKzzAXU+EBsSwGPNYN^`i;sYJn($Sx`gCPL4*Qb9epkz+;63KNb?;)6&xX zv*TkG1a<%-()Q!WkNvFPhtj9GY2Jk9Kz(Rjf4n~zwM^(f=6tE0;5lt&Q5yG*xTkDv z2E~f+=BRwq9vbd6-8w--%Y8@zT(w-Gtpo3%p-}*M&=sO`=f}TZD)bJBV4lh_Yu{$` zqoMg@{@r#&`roy>00405K&M=H{C=lk&Fl7S^l1Wzm=Fcr550=&TM=`VZt2M_{{L2} ztpG%^cp($d$zjmx0f*Ql+T6TNe!JA`n!D(LUiYou must have `bash` set as your default shell. [See Bash Shell Required](/docs/tips/bash/) for more info. + +## Supported Features + +Supported language types: + + - RPG (including RPGLE and OPM RPG) + - COBOL + - C/C++ + - CL + +Supported batch debug features: + + - Debugging of batch programs + - Passing parameters to a batch program when starting a debug session + - Setting line breakpoints + - Saving breakpoints across debug sessions + - Stepping (step into/over/return) + - Viewing variable values in the Locals view + - Monitoring expressions in the Watch view + - Displaying variable values in debug editor hover + - Debugging with the \*SOURCE and \*LIST views + - Debugging with the **Update Production Files** option + + +Supported service entry point debug features: + + - Setting a service entry point on a program, service program, module or procedure + - Enabling, disabling and removing a service entry point + - Setting a condition on a service entry point + - Modifying the user profile of a service entry point + - Logging service entry point activities in an output channel + - Saving service entry points across multiple IDE sessions + - Refreshing service entry points after programs are recompiled + +## Limitations + +The following features are not supported in the current release: +- Code coverage + + + +# Starting to debug + + + + + +After [configuring](../configure/) the Debug Service, launching a debug session is a click of a button away. When you have active source open, a new Debug button will appear in the navigation bar. Breakpoints can be set prior to debugging, or during the debugging session. + + + +![](./debug1.png) + + + +--- + + + + + +Clicking the Debug button will display an input box which will allow the user to customise the command which starts the debug job. This allows the developer to pass in parameters, or call another program to launch the debug session. + +After the debug session has started, every session will break on entry. You can read more about the debugging UI on the [Debug actions section on the Visual Studio Code documentation](https://code.visualstudio.com/docs/editor/debugging#_debug-actions). + + + +![](./debug2.png) + + + +--- + + + + + +To debug a program from the Object Browser, right-click on the program object and select the **Debug Program** option. Like before this will also display an input box to modify the command which starts the debug job. + + + +![](./debug3.png) + + + +## Managing Service Entry Points + + + +Service Entry Point (SEP) can be set using the **Set Service Entry Point** popup menu action from the **Project Explorer** and **Object Browser**. SEP can also be set using the **Create Service Entry Point** toolbar action from the **Service Entry Points** view in the **Run and Debug** side bar. The action will prompt for the Service Entry Point location. The Service Entry Point location can be in a short format which includes the library name and program name (e.g. `MY_LIB/MY_PGM`), or in a long format which also includes the program type, module name and procedure name (e.g. `MY_LIB/MY_PGM *PGM/MY_MOD/MY_PROC`). The supported program types are `*PGM` and `*SRVPGM`. + +![Debug Service Entry Point](debugSEPView.png) + +- A checkbox at a SEP indicates that the SEP is enabled. You can clear the checkbox to disable the SEP. +- You can use the **Edit Condition…** inline action to set a condition on a SEP. The condition is an expression that is evaluated to a boolean value at the given context. +- You can use the **Remove Service Entry Point** inline action to remove the selected SEP, or the **Remove All Service Entry Points** toolbar action to remove all SEPs from the view. +- You can use the **Modify User Profile...** context menu action to modify the owner of the job where the service entry point is hit. The default owner user profile is the currently logged on user. +- Service Entry Point related messages appear in the **IBM i Service Entry Points** output channel. +- Service Entry Points are saved in the debug service job on the host. When a new debug client connects to a running debug service, it will restore the saved service entry points for the current user. +- If a program or service program is recompiled, you can use the **Refresh** action from the context menu to refresh the selected SEP, or use the **Refresh All Service Entry Points** toolbar action to refresh all SEPs in the **Service Entry Points** view. + +## Settings + +The following settings are available from the **Debugger** tab of the **IBM i: Connection Settings** page. The page can be accessed from the Command Palette. + +- **Debug port**: The secure debug port. + +- **SEP debug port**: The Service Entry Point daemon port. + +- **Update production files**: Enable updating of production files during debugging. + +- **Debug trace**: Enable tracing for **Debug Adapter Protocol**. + +The debug port and SEP debug port are specified in the DebugService.env file on the host. + + +# Common issues + +## Debug hangs + +There is a [known issue](https://github.com/codefori/vscode-ibmi/issues/1059) that when you start debugging from VS Code, the debugger hangs and doesn't launch. + +The fix is to check if you've got a prior debug job stuck in `MSGW`. You can do this with `WRKACTJOB`, or a similar command like `WRKSBSJOB QBATCH`. + +**Users should no longer face this issue** as we now submit debug jobs to `QSYSWRK` with `QSYSNOMAX`. + +## `STRDBGSVR` requirement + +The Debug Service that is started depends on the traditional Debug Server. + +![](./error_2.png) + +If you receive this message, do as it says. Simply start the Debug Server with `STRDBGSVR` from a greenscreen. + +## IP not in cert list + +**It is always recommended you use a hostname in the connection settings to make use of the debugger**. + +![](./error_1.png) + +*Error that is shown when connecting to the debugger if connecting using an IP address.* + +This error occurs when the hostname used to connect to the debugger (which might be the IP address that was configured in the connection settings) is not the same as the host name created as part of the certificate. + +If you are using a system that doesn't have a host name (for example `YOURSYSTEM`, or `pub400.com`), then an entry should be added to your device's 'hosts' file. This entry should be the same on all devices in your network to ensure that everyone is using the same hostname. + +* Windows: `c:\Windows\System32\Drivers\etc\hosts` +* Mac: `/etc/hosts` + +Your entry might look like this: + +```txt title="hosts" {2} +# IP HOSTNAME +192.168.0.20 MYIBMI +``` + +If you find that you've added your local hostname entry and the error is still occurring, then you may need to delete the existing certificates from `/QIBM/ProdData/IBMiDebugService/bin/certs` on the IFS and generate them again in the Walkthrough. + +# Frequently Asked Questions + +**Question**: Can I pass parameters to the batch program being debugged? +**Answer**: Use the **Debug As Batch** action, change **Command used to start debugging** to specify program parameters. + +**Question**: Can I debug with Update Production Files set to true? +**Answer**: You can turn on Update Production Files by checking the **Update production files** setting from the Debugger tab of Connection Settings. The Connection Settings page can be opened from **View > Command Palette… > IBM i: Connection Settings**. Please note that this setting applies to all debug sessions for the same connection. + +**Question**: I am not able to set a line breakpoint when debugging a LISTING source. +**Answer**: Please check the following settings in the Settings page: **Features > Debug > Allow Breakpoints Everywhere > Allow setting breakpoints in any file** + +**Question**: What is the JRE requirement for running the debug service? +**Answer**: A Java 11 JRE is required to run IBM i Debug Service on IBM i below 7.6. A Java 17 JRE is required to run IBM i Debug Service on IBM i 7.6. You can use the **JAVA_HOME** environment variable to specify a runtime JRE. If **JAVA_HOME** is not set, the following runtime JREs will be used: + + /QOpenSys/QIBM/ProdData/JavaVM/jdk11/64bit (IBM i below 7.6) + /QOpenSys/QIBM/ProdData/JavaVM/jdk17/64bit (IBM i 7.6) + +**Question**: How can I start IBM i Debug Service? +**Answer**: You can start IBM i Debug Service using one of the following solutions: + + - Using the Navigator + - Using the IBM i Debugger view in the client + - Running the following command from the host: + + QSH CMD('/QIBM/ProdData/IBMiDebugService/bin/startDebugService.sh') + +**Question**: How can I stop IBM i Debug Service? +**Answer**: You can stop IBM i Debug Service using one of the following solutions: + + - Using the Navigator + - Using the IBM i Debugger view in the client + - Running the following command from the host: + + QSH CMD('/QIBM/ProdData/IBMiDebugService/bin/stopDebugService.sh') + +**Question**: What port numbers are used by the debug service? +**Answer**: IBM i Debug Service uses three port numbers: the debug daemon port (default is 8001), the secure debug port (default is 8005) and the service entry point daemon port (default is 8008). The secure debug port is used by the secure communication between the debug service and the debug client. The debug daemon port is only used to stop the debug service. The service entry point daemon port is used for service entry point communication. + +**Question**: How can I change the port numbers for the debug service? +**Answer**: For the debug daemon port, you can change the following value in file /QIBM/ProdData/IBMiDebugService/bin/DebugService.env to specify a different port number: + + DBGSRV_PORT=8001 + +For the secure debug port, you can change the following value in /QIBM/ProdData/IBMiDebugService/bin/DebugService.env to specify a different port number: + + DBGSRV_SECURED_PORT=8005 + + +For the service entry point daemon port, you can change the following value in /QIBM/ProdData/IBMiDebugService/bin/DebugService.env to specify a different port number: + + + DBGSRV_SEP_DAEMON_PORT=8008 + +You need to restart the debug service after changing a port number. + +**Question**: How can I see the output of the debug service? +**Answer**: You can see the output of IBM i Debug Service from the log file under the following path on the host machine: + + /QIBM/UserData/IBMIDEBUGSERVICE/DebugService_log.txt + +**Question**: Can I get trace information for the debug service? +**Answer**: You can turn on tracing by checking the **Debug trace** setting from the Debugger tab of Connection Settings. The Connection Settings page can be opened from **View > Command Palette… > IBM i: Connection Settings**. Debug trace will appear in the **Debug Console**. + +**Question**: I am getting a message “EQAVS1007E myHost on port 8005 could not be connected” when I start a debug session. +**Answer**: IBM i Debug Service is not started yet. You need to start debug service before starting a debug session. + +**Question**: I am seeing a message “IBM i Debug Server has not been started yet. Please run the STRDBGSVR command from a user profile with enough authority.”. +**Answer**: You need to run STRDBGSVR from a terminal session to start Debug Server (QB5ROUTER) first. IBM i Debug Service requires a running Debug Server. + +**Question**: I am seeing a message “Your debug server version is not up to date. IBM i Debug Service requires a host PTF update.”. +**Answer**: IBM i Debug Service depends on the following debug server PTFs for strong password encryption. You need to load one of the PTFs below or a superseded PTF. +- V7R3 PTF SI82198 +- V7R4 PTF SI82335 +- V7R5 PTF SI82343 + +**Question**: I do not have the QDBGSRV user profile after installing the debug service on IBM i 7.5. +**Answer**: The debug service PTFs on 7.3/7.4/7.5 are update installs. An update install depends on a previous installation of the debug service PTF. The update install does not create the QDBGSRV user profile. If you have not installed debug service before, please install the v1 debug service PTF first, and then update the debug service PTF to the next levels. + +**Question**: How can I set a Service Entry Point on a procedure? +**Answer**: Select the **Set Service Entry Point** action on the target program or service program. In the service entry point location prompt, change the last part of the entry field value “/*ALL/*ALL” to specify the module name and procedure name. + +**Question**: What happens to the Service Entry Points after I disconnect from the current connection? +**Answer**: The Service Entry Points are removed from the debug client after the connection is terminated. However, the SEPs are still saved in the running host debug service job. The SEPs will be restored in the client if you connect to the same host again. + +**Question**: Service entry point without a condition works for me but conditional service entry point does not work. The program appears to be hung from a 5250 session when a conditional service entry point is hit. +**Answer**: It may be an authority issue with your debug user profile. Your debug user profile need to have *USE authority to the profile that owns the QB5ROUTER job and also its job description. Suppose the owner of the QB5ROUTER job is USR1 and your debug user profile is USR2, and the job description of the USR1 profile is QGPL/USR1, you can use the following commands from a terminal session to grant additional authority to your debug user profile: + + GRTOBJAUT OBJ(QGPL/USR1) OBJTYPE(*ALL) USER(USR2) AUT(*USE) + GRTOBJAUT OBJ(USR1) OBJTYPE(*USRPRF) USER(USR2) AUT(*USE) + +You need to restart the debug service and the debug router (QB5ROUTER) after these changes. + +**Question**: I started the second debug session, but it does not come up. +**Answer**: The debug client can support multiple debug sessions, but the IDE has a limitation that the new debug session does not automatically take focus, if you already have an existing debug session. You can select the new debug session from the drop down list of the Debug toolbar, or from the Call Stack view. The source of the new debug session will appear in a debug editor after the debug session is selected. + +**Question**: I am seeing a **Password Request** dialog with message “The extension IBM: ibmidebug is requesting connection data.” +**Answer**: When the **Service Entry Points** view is populated, it connects to the running debug service to retrieve the current set of SEPs. This operation requires the user password. If you select **Allow**, the **IBM i Developer** extension will allow the **IBM i Debug** extension to access the user password in its secret store. + +**Question**: What diagnostic information should I collect to report a debug problem? +**Answer**: Please collect the following diagnostic information: +- The content of the DebugService_log.txt file under /QIBM/UserData/IBMIDEBUGSERVICE. +- The content of the debug service workspace log in /QIBM/UserData/IBMIDEBUGSERVICE/startDebugService_workspace/USER/.metadata/.log, where USER is the user profile that starts the debug service. +- Check the **Debug trace** option from the Debugger tab of the Connection Settings page. Save the trace text in the **Debug Console** to a file. Edit the file to remove the user password that appears under the trace statement for the launch request. +