Guia de rastreamento dinâmico Solaris

Sub-rotinas

As sub-rotinas são diferentes das ações porque elas geralmente afetam apenas o estado interno do DTrace. Portanto, não há sub-rotinas destrutivas e as sub-rotinas nunca rastreiam dados para buffers. Muitas sub-rotinas possuem análogos nas interfaces da Seção 9F ou da Seção 3C. Consulte Intro(9F) e Intro(3) para obter mais informações sobre as sub-rotinas correspondentes.

alloca()

void *alloca(size_t size)

alloca() aloca tamanho bytes fora do espaço temporário e retorna um ponteiro para a memória alocada. É garantido que o ponteiro retornado tenha um alinhamento de 8 bytes. O espaço temporário só é válido enquanto durar uma cláusula. A memória alocada com alloca() será desalocada quando a cláusula for concluída. Se não houver espaço temporário suficiente disponível, não será alocada a memória e um erro será gerado.

basename()

string basename(char *str)

basename() é um análogo de D para basename(1). Esta sub-rotina cria uma seqüência que consiste em uma cópia da seqüência especificada, mas sem um prefixo que termine em /. A seqüência retornada é alocada fora da memória temporária e, portanto, é válida somente enquanto durar a cláusula. Se não houver espaço temporário suficiente disponível, basename não será executada e um erro será gerado.

bcopy()

void bcopy(void *src, void *dest, size_t size)

bcopy() copia tamanho bytes da memória apontada por src para a memória apontada por dest. Toda a memória de origem deve estar fora da memória temporária e toda a memória de destino deve estar dentro dela. Se essas condições não forem atendidas, a cópia não será realizada e um erro é gerado.

cleanpath()

string cleanpath(char *str)

cleanpath() cria uma seqüência que consiste em uma cópia do caminho indicado por str, mas com alguns elementos redundantes eliminados. Em particular, os elementos “/./” no caminho são removidos e os elementos “/../” são recolhidos. Os elementos /../ são recolhidos no caminho sem levar em consideração os links simbólicos. Portanto, é possível que cleanpath() obtenha um caminho válido e retorne um mais curto, inválido.

Por exemplo, se str fosse “ /foo/../bar” e /foo fosse um link simbólico para /net/foo/export, cleanpath() retornaria a seqüência “/bar” embora bar só possa estar em /net/foo e não em /. Essa limitação deve-se ao fato de que cleanpath() é chamada no contexto de um teste acionado, onde a resolução completa de link simbólico ou nomes arbitrários não são possíveis. A seqüência retornada é alocada fora da memória temporária e, portanto, é válida somente enquanto durar a cláusula. Se não houver espaço temporário suficiente disponível, cleanpath não será executada e um erro será gerado.

copyin()

void *copyin(uintptr_t addr, size_t size)

copyin()copia o tamanho especificado em bytes do endereço de usuário especificado em um buffer temporário do DTrace e retorna o endereço desse buffer. O endereço do usuário é interpretado como um endereço no espaço do processo associado ao segmento atual. É garantido que o ponteiro de buffer resultante tenha um alinhamento de 8 bytes. O endereço em questão deve corresponder a uma página com falhas no processo atual. Se o endereço não corresponder a uma página com falhas, ou não houver espaço temporário suficiente disponível, NULL será retornado e um erro será gerado. Consulte o Capítulo 33Rastreio de processo do usuário para saber as técnicas para reduzir a probabilidade de erros de copyin.

copyinstr()

string copyinstr(uintptr_t addr)

copyinstr() copia uma seqüência de C terminada com caractere nulo do endereço de usuário especificado para um buffer temporário do DTrace e retorna o endereço desse buffer. O endereço do usuário é interpretado como um endereço no espaço do processo associado ao segmento atual. O tamanho da seqüência é limitado pelo valor definido pela opção strsize. Consulte o Capítulo 16Opções e ajustáveis para obter detalhes. Assim como com copyin, o endereço especificado deve corresponder a uma página com falhas no processo atual. Se o endereço não corresponder a uma página com falhas, ou não houver espaço temporário suficiente disponível, NULL será retornado e um erro será gerado. Consulte o Capítulo 33Rastreio de processo do usuário para saber as técnicas para reduzir a probabilidade de erros de copyinstr.

copyinto()

void copyinto(uintptr_t addr, size_t size, void *dest)

copyinto()copia o tamanho especificado em bytes do endereço de usuário especificado para o buffer temporário do DTrace especificado por dest. O endereço do usuário é interpretado como um endereço no espaço do processo associado ao segmento atual. O endereço em questão deve corresponder a uma página com falhas no processo atual. Se o endereço não corresponder a uma página com falhas, ou se uma das memórias de destino estiver fora do espaço temporário, não ocorrerá uma cópia e um erro será gerado. Consulte o Capítulo 33Rastreio de processo do usuário para saber as técnicas para reduzir a probabilidade de erros de copyinto.

dirname()

string dirname(char *str)

dirname() é um análogo de D para dirname(1). Essa sub-rotina cria uma seqüência que consiste em todos os níveis, exceto o último, do nome de caminho especificado por str. A seqüência retornada é alocada fora da memória temporária e, portanto, é válida somente enquanto durar a cláusula. Se não houver espaço temporário suficiente disponível, dirname não será executada e um erro é gerado.

msgdsize()

size_t msgdsize(mblk_t *mp)

msgdsize() retorna o número de bytes na mensagem de dados apontada por mp. Consulte msgdsize(9F) para obter detalhes. msgdsize() inclui somente blocos de dados do tipo M_DATA na contagem.

msgsize()

size_t msgsize(mblk_t *mp)

msgsize() retorna o número de bytes na mensagem apontada por mp. Ao contrário de msgdsize (), que retorna somente o número de bytes dos dados, msgsize() retorna o número total de bytes na mensagem.

mutex_owned()

int mutex_owned(kmutex_t *mutex)

mutex_owned() é uma implementação de mutex_owned(9F). mutex_owned() retorna um valor diferente de zero se o segmento de chamada possuir atualmente o mutex do kernel especificado ou zero se o mutex adaptável especificado não possuir proprietário no momento.

mutex_owner()

kthread_t *mutex_owner(kmutex_t *mutex)

mutex_owner() retorna o ponteiro do segmento do proprietário atual do mutex do kernel adaptável especificado. mutex_owner() retorna NULL se o mutex adaptável especificado não possuir proprietário no momento ou se o mutex especificado for um mutex de rotação. Consulte mutex_owned(9F).

mutex_type_adaptive()

int mutex_type_adaptive(kmutex_t *mutex)

mutex_type_adaptive() retorna um valor diferente de zero se o mutex do kernel especificado for do tipo MUTEX_ADAPTIVE , ou zero se não for. Os mutexes são adaptáveis se atenderem a uma ou mais das seguintes condições:

Consulte mutex_init(9F) para obter mais detalhes sobre mutexes. A maioria dos mutexes no kernel do Solaris são adaptáveis.

progenyof()

int progenyof(pid_t pid)

progenyof() retorna um valor diferente de zero se o processo de chamada (o processo associado ao segmento que está acionando atualmente o teste correspondido) estiver entre a origem do ID especificado do processo.

rand()

int rand(void)

rand() retorna um inteiro pseudo-aleatório. O número retornado é um número pseudo-aleatório fraco e não deve ser usado para qualquer aplicação criptográfica.

rw_iswriter()

int rw_iswriter(krwlock_t *rwlock)

rw_iswriter() retorna um valor diferente de zero se o bloqueio de leitor-autor especificado for mantido ou desejado por um autor. Se o bloqueio for mantido somente por leitores e nenhum autor estiver bloqueado ou se o bloqueio não for mantido, rw_iswriter() retornará zero. Consulte rw_init(9F).

rw_write_held()

int rw_write_held(krwlock_t *rwlock)

rw_write_held() retorna um valor diferente de zero se o bloqueio de leitor-autor especificado estiver sendo mantido atualmente por um autor. Se o bloqueio for mantido somente por leitores ou não for mantido, rw_write_held () retornará zero. Consulte rw_init(9F).

speculation()

int speculation(void)

speculation() reserva um buffer de rastreio especulativo para uso com speculate() e retorna um identificador para esse buffer. Consulte o Capítulo 13Rastreio especulativo para obter detalhes.

strjoin()

string strjoin(char *str1, char *str2)

strjoin() cria uma seqüência que consiste em str1 concatenado com str2. A seqüência retornada é alocada fora da memória temporária e, portanto, é válida somente enquanto durar a cláusula. Se não houver espaço temporário suficiente disponível, strjoin não será executada e um erro será gerado.

strlen()

size_t strlen(string str)

strlen() retorna o tamanho da seqüência especificada em bytes, excluindo o byte nulo de terminação.