Skip to main content

Debugging X++ code in Dynamics AX


When you are developing X++ code for Dynamics AX over the time you will run into a situation where the below Tips & Tricks can make your debugging live easier.
The informations are very rare to find at one place. Since I was also once in the situation needing to find them, I thought it maybe a good idea to collect the most useful ones I'm using day to day...
The most oblivious one: Interrupting the code execution
When you have written some code that is causing an endless loop (or a very long execution) and you want to know what code is currently keeping the client busy. The easiest way is pressing [Ctrl] + [Break] on the keyboard.
This will stop the code execution and show up a message box: Are you sure that you want to cancel this operation?
If you hold down the [Shift] button on the keyboard while you click at the No button of the message box, the AX Debugger will be launched exactly at the line of code that was about to be executed. From here you can continue to step over / into line by line and try to identify the cause of your endless loop.
The breakpoint is sometimes not hit?
Sometimes it happens that a breakpoint is not hit although you are sure the respective code was executed. For example if you want to debug code behind User Controls like Form buttons this can happen.
Here instead of putting a breakpoint at a line of code insert the breakpoint keyword.
public void executeQuery()
{
;
breakpoint;super();
}
Please note that using breakpoint has a serious side effect:
The breakpoint will be hit by all user sessions! This is definitely something you
don't want to do in a live environment.
How can I see the call stack that resulted in X++ exception?
When you run into an exception that is showing up in the InfoLog usually double clicking at the error brings you to the line of code where the error was raised.
Sometimes knowing the line of code where the error was raised is however not good enough as the individual call stack is what you need to know. Putting a breakpoint at the line of code where the exception was raised is helpful, what however if you are in a loop and you don't know what loop iteration results in the error especially if the error is random?
Instead of putting the breakpoint at the line of code where the exception might be raised, put a breakpoint in the addmethod of the Info class, e.g. at the line switch (logLevel).
Exception add(
// ...
;
switch (logLevel)
// ...
Info::add is always called when something is written to the InfoLog and since an exception shows up in the InfoLog as soon as the exception was raised the Info::add method is called and here you will hit your breakpoint.
How can I get the current X++ call stack?
The static method xppCallStack() of the xSession Kernel class returns the current X++ call stack:
//...
Info(con2str(
xSession::xppCallStack() ));
//...
The function funcname() returns the name of the method where it has been called.
public void executeQuery()
{
;
Info(
funcname() ); //In this case "executeQuery" will show up in the InfoLog

super();
}
How can I see the SQL query that the Dynamics AX Kernel is generating for my Form?
When you are debugging your solution, sometimes you might want to see the SQL Query the Dynamics AX Kernel has generated for your Form. While you can of course trace this directly at your Database Server, you also can do this in X++ using the QueryBuildDataSource class.
Let's imagine you have a Form that has PurchTable as Data Source. You have to override the executeQuery method of the PurchTable Data Source and add the following code:
public void executeQuery()
{
Query q;
QueryBuildDataSource qbds;
;
q = this.query();
qbds = q.dataSourceName("PurchTable"); //Replace with the current Table
info(
qbds.toString() );

super();
}

Comments

  1. Very helpful for us and gained more knowledge from it. We are very greatful and thanks a lot.
    Microsoft Dynamics CRM Online Training | Microsoft Dynamics AX Training

    ReplyDelete

Post a Comment

I will appreciate your comments !

Popular posts from this blog

D365O - How to add financial dimension in grid

This post outlines the steps; how to add financial dimensions (segmented control) in a grid in D365O. Let's assume we are adding new table and form for below explanation; New table contains two fields  AccountType and  LedgerDimension with relation to DimensionAttributeValueCombination table  Form looks like this; Set properties for segmented control under form design; - Auto declaration = Yes - Account type field = AccountType - Controller class = DimensionDynamicAccountController - Filter expression = %1 1. Override modified method for LedgerDimension field under form's datasource 2. Override lookup and checkUserCustomLookup method on ledger dimension segmented control in form desgin Datasource | D365O_FinancialDimension | LedgerDimension | modified [DataSource]     class D365O_FinancialDimension     { ...

The Dual Write implementation - Part 1 - Understand and Setup

What is Dual-write? Tightly couples – complete at one transaction level Near real time Bi-directional Master data and business documents – Customer records you are creating and modifying and at this document we are talking about sales orders or quotes and invoice. Master data could be reference data e.g. customer groups and tax information Why Dual-write and why not Data Integrator? Data Integrator is Manual or Scheduled One directional Now, Let's deep dive and understand what is required for Dual-write setup and from where to start. First thing first, check you have access to https://make.powerapps.com/ Choose right environment of CDS (CE) Make sure you have access to the environment too, click on gear icon and Admin Center  Look for required environment and Open it, you must have access as going forward you are going to configure dual write steps in the environment user the same user you are logged in now. Now, go back to power platform admin center and...

Another step closer - Finance Operations data in Power Platform - Virtual Entities

This post focuses on the integration technologies available to have the Microsoft Dynamics 365 Finance Operations data available in Dataverse/Common Data Services/CDS. What could be better then having The biggest ERP system's data in Power Platform. You can Power Portals, Power Apps, Power BI analytical reports, use power virtual agents for inventory closing and year end closing processes, manage expenses and employee/contractors time entry processes, most of these processes can be even without logging to MS ERP (Dynamics 365 Finance Operation) so can safe on license cost too.  Let's see what options are available to integrate F&O data with Power Platform however, this post is dedicated to Virtual Entities.  3 Options available out-the-box to integrate F&O data with Power Platform; 👉  Data Integrator  - Click on link to read more 👉  Dual-Write  -  Click on link to read more 👉  Virtual Entities - MS Tech Talk on Virtual entities   ...