Salesforce debugger - отладка кода

Salesforce предоставляет разработчику ряд инструментов для отладки приложения. Здесь я покажу как я пользуюсь этими инструментами, распишу ряд методик, которые выработал для себя.
Кому интересно почитать первоисточник прощу сюда Understanding the Debug Log

1. Запись в лог

Выполнение любого написанного кода оставляет в логах salesforce массу информации. Анализ данный информации помогает найти ошибки в коде, увидеть состояние переменных, результаты SOQL и DML операций.

Получить лог можно двумя способами:
- Developer console
Setup -> Monitoring -> Debug Logs 

Откройте Developer console в новом окне. Перейдите на любую созданную страницу. Я покажу пример log при работе страницы Hello World, созданной здесь.

В верхней части находится список логов, который автоматически пополняется по ходу выполнения кода на орге. Открыть нужный лог можно в двух разных представлениях: обычном (лог парсится и представляется в виде кучи секций со своей информацией) и в исходном виде (Raw log). Ниже представлены оба представления одного и того же лога.



Я предпочитаю использовать Raw log потому что информация представляется в обычном текстовом виде, который можно скопировать или использовать возможности браузера для поиска (Ctrl + F). Обычный лог (обычно большой) долго парсится и часто глючит. К тому же у обычного лога есть ограничение по размеру и если лог получается слишком большой, то developer console все равно вернет его в Raw формате. Поэтому делаем так - выделяем нужный лог и нажимаем кнопку Open Raw Log.

Конечно разбираться с километрах строк не самое приятное занятие. Поэтому вот мой практический совет. Активно используем
System.Debug('some info');
При чем совет еще практичнее вначале выводимой строки ставить маркер, который поможет потом быстро найти строчку логе.
Я, например, использую делаю так:
System.Debug('XXXXX0 - some info');
После этого достаточно открыть лог и быстро найти строку обычным текстовым поиском.
Я добавил строку для вывода информации в debug log в наш контроллер для Hello World страницы и перезапустил ее. После этого в браузере поиском (Crtl+F) нашел строку по маркеру.



Разберем строку из debug log



23:49:26.214 (214347000)|USER_DEBUG|[3]|DEBUG|XXXXX0 - hello world debug info


23:49:26.214 (214347000) - время в формате HH:mm:ss.SSS + в скобках время в наносекундах прошедщее с момента прихода запроса
USER_DEBUG - событие, которое инициировало вывод информации в лог.
[3] - номер строки в коде
DEBUG - тип выводимой информации
XXXXX0 - hello world debug info - собственно сама информация.

Если искать логи в Setup -> Monitoring -> Debug Logs , то появляется дополнительная возможность - можно (и даже нужно) указать пользователя, для которого необходимо выводить логи. Это очень полезно, когда работаешь под администратором (Administrator), а надо узнать почему не работает код для другого пользователя (с другим профилем). Это в основном происходит из-за неправильной или неполной настройки прав доступа для разных категорий пользователей.

2. Вывод переменных на страницу.

Не самый красивый, для многих примитивный метод. Но он работает. И работает быстрее чем лог :)

Воспользуемся замечательных инструментом salesforce - системой сообщений. Есть замечательный кусочек кода, который позволяет вывести на странице в красивом виде любую текстовую информацию.

в контроллере надо разместить такую строчку:
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'my first debug info'));

а на странице - тег:
<apex:pageMessages />

Вот усовершенствованный код тестовой страницы:

 public with sharing class Hello_World_Controller {  
   public List<Contact> Contacts { get{  
     SYSTEM.DEBUG('XXXXX0 - hello world debug info');  
     List<Contact> contacts = [SELECT Id, Name, Email, Account.Name FROM Contact LIMIT 1000];  
     ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'hello page messages'));  
     ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'contacts.size() = '+contacts.size()));  
     ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'contacts - '+contacts));  
     return contacts;  
   } set;}  
 }  


 <apex:page controller="Hello_World_Controller">  
   <apex:pageMessages />  
    <apex:pageBlock title="Contacts">  
      <apex:pageBlockTable value="{!Contacts}" var="c">  
        <apex:column value="{!c.Name}"/>  
        <apex:column value="{!c.Email}"/>  
        <apex:column value="{!c.Account.Name}"/>  
      </apex:pageBlockTable>  
    </apex:pageBlock>  
 </apex:page>  


На странице должен появиться вот такой симпатичный вывод сообщений. При чем очень полезной фишкой является красивый вывод содержимого списка контактов. Если вы попытаетесь вывести этот список в debug log, то строка будет обрезана до какого-то там максимального количества символов.




Комментарии

Отправить комментарий

Популярные сообщения из этого блога

Начало работы, первые шаги, hello world в Salesforce