Guia de rastreamento dinâmico Solaris

Usando uma especulação

Para usar uma especulação, um identificador retornado de speculation () deve ser passado para a função speculate() em uma cláusula antes de quaisquer ações de gravação de dados. Todas as ações de gravação de dados subseqüentes em uma cláusula contendo speculate() serão rastreadas especulativamente. O compilador de D gerará um erro de tempo de compilação, se uma chamada a speculate() seguir as ações de gravação de dados em uma cláusula de teste de D. Portanto, as cláusulas podem conter rastreio especulativo ou solicitações de rastreio não especulativo, mas não ambos.

As ações de agregação, as ações destrutivas e a ação exit nunca podem ser especulativas. Qualquer tentativa de usar uma dessas ações em uma cláusula contendo os resultados de speculate() causará um erro de tempo de compilação. Uma speculate() não pode seguir uma speculate(): somente uma especulação é permitida por cláusula. Uma cláusula que contém somente uma speculate() rastreará especulativamente a ação padrão, que é definida para rastrear somente o ID de teste ativado. Consulte o Capítulo 10Ações e sub-rotinas para obter uma descrição da ação padrão.

Geralmente, você atribui o resultado de speculation() a uma variável de segmento local e, em seguida, usa essa variável como um predicado subseqüente para outros testes, assim como um argumento speculate(). Por exemplo:

syscall::open:entry
{
	self->spec = speculation();
}

syscall:::
/self->spec/
{
	speculate(self->spec);
	printf("this is speculative");
}