Como depurar

From The Document Foundation Wiki
Jump to: navigation, search

Depurando símbolos

Você precisa de símbolos de depuração para fazer qualquer depuração prática. Então habilite com

$ ./autogen.sh --enable-symbols


Desativando o alocador personalizado para o memcheck

Por padrão o LibreOffice usa um alocador de memória personalizado, assim o valgrind não será capaz de dar resultados completos a menos que este esteja desativado. Desative-o em tempo de execução com ...

$ export G_SLICE=always-malloc


este é deliberadamente o mesmo nome de variável e valor que desabilita um alocador personalizado diferente do glib para fazer depuração mais fácil. Isso também pode ser desativado em tempo de compilação com


$ ./autogen.sh --with-alloc=system

Depurando testes do cppunit

Em tempo de compilação, se um teste CppUnit falhar você pode obter um depurador de lá com ...


$ export GDBCPPUNITTRACE="gdb --args"


Agora, quando você compilar, o gdb vai começar com o teste CppUnit carregado, digitando "run" para executar o teste sob o gdb.


Alternativamente, se o teste quebrar e reclama de uma exceção, você pode traçar um teste de CppUnit para descobrir a partir de onde a última exceção foi lançada com

$ export DEBUGCPPUNIT=true


que irá registrar os lançamentos e capturas em gdbtrace.log.


Testes de cppunit com Valgrind

Em tempo de compilação, você pode fazer os testes CppUnit com valgrind e outros testes com


$ export VALGRIND=memcheck


Isso configurará automaticamente G_SLICE=always-malloc e sempre deve causar os testes CppUnit e os testes de regressão do hunspell a ser executado no Valgrind.


Usando Valgring no LibreOffice em si

$ export VALGRIND=memcheck

Também fará o LibreOffice executar-se sob o Valgrind


Executando o smoketest

$ make check


Este é o seu amigo e autoexecuta o smoketest curto para você. Este deve passar sempre. Quebras são preocupantes.


Depurando ciclos de vida do UNO C++

A contagem de referência é armazenada como m_refCount, assim, por exemplo, quebra no construtor do objeto UNO e adiciona um relógio para ele para ver quem assume a propriedade compartilhada do objeto.


(gdb) watch *(&m_refCount)


Macros úteis

Nota: Essas macros resolvem para ((void)0) se o código usado foi compilado com 'debug=true' e 'dbglevel > 0' (às vezes > 1).

  • OSL_DEBUG_ONLY( code ): code só será executado se dbglevel > 0;
  • OSL_ASSERT(expression) (também visto como DBG_ASSERT): garante que expression é verdadeiro;
  • OSL_TRACE( msg, ... ): imprime uma mensagem de depuração, suporta formatação no estilo printf, precisa dbglevel > 1


Veja também sal/inc/osl/diagnose.h, onde essas e mais algumas macros são definidas e explicadas.

OSL_DEBUG_LEVEL

Atualmente, existem quatro níveis de depuração definidos:

  • level 0: sem depuração habilitada para tudo
  • level 1: afirmações habilitadas - esta é habilitada com ./autogen.sh --enable-debug
  • level 2: código de depuração adicional (usuário) habilitado - build -- debug=true dbglevel=2
  • level 3: modo ultra-verboso - build -- debug=true dbglevel=3