As opções utilizadas para configurar uma sessão específica de Ladybug podem ser salvas para uso futuro.
Classes podem ser rescritas no momento em que são carregadas (rescrita on the fly, que é o default) ou em algum momento antes da execução (neste caso, a versão rescrita deve ser armazenada em algum diretório). A rescrita on the fly é mais simples de usar, mas não funciona se:
Há dois algoritmos: Dinning-Schonberg and Eraser. As três opções de Eraser diferem apenas na implementação: Vanilla Eraser e Fast Eraser são mais rápidos, enquanto GC Eraser é mais econômico no uso de memória.
Eraser refere-se ao algoritmo proposto por Stefan Savage, Michael Burrows, Greg Nelson, Patrick Sobalvarro e Thomas Anderson em Eraser: A Dynamic Data Race Detector for Multithreaded Programs. Para cada variável (potencialmente) compartilhada, Eraser verifica se há um monitor que proteja todos acessos a ela (a inicialização de variáveis, entretanto, não é levada em consideração).
Dinning-Schonberg refere-se ao algoritmo para detecção de condições de disputa proposto por Anne Dinning and Edith Schonberg em Detecting Access Anomalies in Programs with Critical Sections. Este algoritmo é mais genérico que Eraser, porém mais lento; ele deve ser usado se:
O algoritmo Dinning-Schonberg pode emitir falsos alarmes devido a initializações "complexas" de campos estáticos (complexas, aqui, quer dizer que um campo estático refere-se a um objeto, e um campo deste objeto é escrito quando a classe é inicializada). Se seu programa é vítima destes alarmes, pode ser melhor selecionar a opção Ignorar inicialização de classes. E também seguir este link para saber mais sobre inicialização de classes e como isso afeta Ladybug.
Por fim, a menos que seu programa interaja com a thread gerenciadora de eventos antes que qualquer janela seja exibida, a opção Thread AWT é iniciada quando a primeira janela é exibida deve ser deixada selecionada (na maior parte dos casos pode-se assumir que esta thread é iniciada só quando a primeira janela aparece).
O programa pode ser interrompido, uma mensagem pode ser exibida ou uma exceção pode ser atirada quando uma condição de disputa é detectada. Selecionar a opção Avisar sobre a mesma variável apenas uma vez impede que avisos sobre um campo de um objeto sejam emitidos mais de uma vez.
A saída do programa examinado por Ladybug pode ser enviada para a saída padrão (System.out e System.err), uma nova janela ou um arquivo (escolhendo enviar a saída para um arquivo é preciso especificar o nome do arquivo também).
Se a opção Com detalhes é selecionada, o algoritmo para detecção
de condições de disputa exibirá mensagens (sobre tudo o que fizer. Além disso,
se um filtro é especificado, mensagens sobre variáveis que não estão presentes
no filtro não serão exibidas. O filtro é uma lista de nomes de variáveis
separados por dois pontos. Por exemplo:
apple:Tree.banana:@12efcc.watermelon:@a1009b.101
significa que mensagems sobre acessos a variáveis devem ser exibidas apenas
se elas se referem às variáveis:
Você só precisa fornecer a linha de comando para rodar seu programa; Ladybug é responsável por alterá-la no que for necessário. Contudo:
Inicia a execução da versão de seu programa monitorada por Ladybug.
É possível informar variáveis que não devem ser monitorados. Nomes de variáveis podem ser completamente qualificados (para evitar ambiguidades) mas isso não é necessário (por exemplo, org.rk.Foo.myField é um nome completamente qualificado).
Classes e pacotes que não devem ser rescritos podem ser informados também. Para nomes de pacotes, um asterisco no final funciona como um coringa. Por exemplo, um nome como com.foo.* faz com que Ladybug ignore todas as classes no pacote com.foo quando rescrevendo seu programa.
É preciso informar quais arquivos devem ser rescritos, mas apenas quando você não está usando rescrita on-the-fly. Neste caso, se você não especificar um diretório de saída para armazenar os arquivos rescritos, os arquivos originais serão sobrescritos pela nova versão. Diretórios encontrados na lista de arquivos a rescrever serão processados recursivamente se a opção Processar pastas recursivamente estiver selecionada.
Esta opção deve ser selecionada se compatibilidade binária deve ser levada em consideração quando rescrevendo as classes. Isto é importante só se, no seu programa, estas três condições são verdadeiras: