Hy!
In the script i used self->time = timestamp because in that version i
used @semcheck[this->name] = quantize(timestamp - self->time);.
After the letters i thinking and checking, there are syscall if i
check only entry:
root at thelab ~/Tools/IPC$ ./ipc_count_entry.d
fbt:ipc:ipcs_lock 2
fbt:ipc:ipcs_unlock 2
fbt:ipc:ipc_lock 4
fbt:ipc:ipc_commit_begin 5
fbt:ipc:ipc_commit_end 5
fbt:ipc:ipc_get 5
fbt:ipc:ipc_remove 5
fbt:ipc:ipc_rmid 5
fbt:ipc:ipcperm_stat64 5
fbt:ipc:ipc_rele 9
fbt:ipc:ipc_alloc_test 10
fbt:ipc:ipc_hold 10
fbt:genunix:sema_tryp 107
fbt:genunix:sema_p 110
fbt:genunix:sema_destroy 160
fbt:genunix:sema_init 160
fbt:genunix:sema_v 217
fbt:semsys:sem_undo_add 1416
fbt:semsys:sem_undo_compar 1416
fbt:semsys:semop 1416
fbt:semsys:semsys 1416
syscall::semsys 1416
fbt:ipc:ipc_lookup 1436
fbt:ipc:ipcperm_access 1436
fbt:ipc:ipc_lock_internal 1440
root at thelab ~/Tools/IPC$ cat ./ipc_count_entry.d
#!/usr/sbin/dtrace -qs
#pragma D option quiet
#pragma D option destructive
fbt:ipc::entry,
fbt:semsys::entry,
fbt:genunix:sem*:entry,
syscall::sem*:entry
{
this->name = strjoin(probeprov,
strjoin(strjoin(":",probemod),strjoin(":",probefunc)));
@semcheck[this->name] = count();
}
tick-10sec
{
exit(0);
}
And i find where set the original script self->time to 0 before
syscall::semsys:return, if i used flowident to
root at thelab ~/Tools/IPC$ ./ipc_syscall_flow.d
CPU FUNCTION
0 => semsys syscall::semsys
0 -> semsys fbt:semsys:semsys
0 <- semsys fbt:semsys:semsys <-
1. point where syscall''s self->time set to 0 in the original script
0 -> semop fbt:semsys:semop
0 -> ipc_lookup fbt:ipc:ipc_lookup
0 -> ipc_lock_internal fbt:ipc:ipc_lock_internal
0 <- ipc_lock_internal
fbt:ipc:ipc_lock_internal <- 2. point where syscall''s self->time
set
to 0 in the original script
0 <- ipc_lookup fbt:ipc:ipc_lookup
<- 3. point where syscall''s self->time set to 0 in the
original script
0 -> ipcperm_access fbt:ipc:ipcperm_access
0 -> crgetuid fbt:genunix:crgetuid
0 <- crgetuid fbt:genunix:crgetuid
0 -> getzoneid fbt:genunix:getzoneid
0 <- getzoneid fbt:genunix:getzoneid
0 <- ipcperm_access
fbt:ipc:ipcperm_access <- 4. point where syscall''s self->time set
to 0
in the original script
0 -> avl_find fbt:genunix:avl_find
0 -> sem_undo_compar fbt:semsys:sem_undo_compar
0 <- sem_undo_compar
fbt:semsys:sem_undo_compar<- 5. point where syscall''s self->time
set
to 0 in the original script
0 <- avl_find fbt:genunix:avl_find
0 -> sem_undo_add fbt:semsys:sem_undo_add
0 <- sem_undo_add
fbt:semsys:sem_undo_add <- 6. point where syscall''s self->time
set to
0 in the original script
0 <- semop fbt:semsys:semop <- 7.
point where syscall''s self->time set to 0 in the original script
0 <= semsys syscall::semsys
Time: 232750
My original script doesn''t reach syscall::semsys:return in my original
script.
Thanks a lot Pramod and Adam, it was my fault :)
Br.:
Cni
2011/8/26 Adam Leventhal <ahl at delphix.com>:> Hi Cni,
>
> Your script is not operating the way you intended, but DTrace is
> functioning properly. The fbt return probes are firing before the
> syscall return probes and thus setting self->time to 0 so that when
> the syscall return probe fires the predicate evaluates to false.
>
> You don''t seem to be doing any computation with self->time. If
you''re
> just trying to count the number of times the functions you''ve
listed
> fire, you can just do this:
>
> fbt:ipc::entry,
> fbt:semsys::entry,
> fbt:genunix:sem*:entry,
> syscall::sem*:entry
> {
> ? ? this->name = strjoin(probeprov, strjoin(strjoin(":",
probemod),
> strjoin(":", probefunc)));
> ? ? @semcheck[this->name] = count();
> }
>
> Adam
>
> On Fri, Aug 26, 2011 at 1:17 AM, Juhasz Balint <cnimen at gmail.com>
wrote:
>> Hy!
>>
>>
>> I think i find some interesting problem (maybe it is basic :) ):
>> root at thelab ~/Tools/IPC$ ./ipc_count_syscall.d
>>
>> ?syscall::semsys ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1690
>> root at thelab ~/Tools/IPC$ cat ./ipc_count_syscall.d
>> #!/usr/sbin/dtrace -qs
>>
>> #pragma D option quiet
>> #pragma D option destructive
>>
>> syscall::sem*:entry
>> {
>> ? ? ?self->time = timestamp;
>> }
>>
>> syscall::sem*:return
>> /self->time/
>> {
>> ? ? ?this->name = strjoin(probeprov,
strjoin("::",probefunc));
>> ? ? ?@semcheck[this->name] = count();
>> ? ? ?self->time = 0;
>> }
>>
>> tick-10sec
>> {
>> ? ? ?exit(0);
>> }
>>
>> It''s ok, but if i put fbt provider checking to this script, i
can''t
>> see syscall fields in the count() result:
>>
>> root at thelab ~/Tools/IPC$ ./ipc_count_all.d
>>
>> ?fbt:genunix:sema_destroy ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4
>> ?fbt:genunix:sema_init ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 8
>> ?fbt:genunix:sema_tryp ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?81
>> ?fbt:genunix:sema_p ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?208
>> ?fbt:genunix:sema_v ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?289
>> ?fbt:ipc:ipc_lock_internal ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1850
>> ?fbt:ipc:ipcperm_access ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1850
>> ?fbt:semsys:sem_undo_add ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1850
>> ?fbt:semsys:sem_undo_compar ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1850
>> ?fbt:semsys:semsys ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1850
>> root at thelab ~/Tools/IPC$ cat ./ipc_count_all.d
>> #!/usr/sbin/dtrace -qs
>>
>> #pragma D option quiet
>> #pragma D option destructive
>>
>> fbt:ipc::entry,
>> fbt:semsys::entry,
>> fbt:genunix:sem*:entry,
>> syscall::sem*:entry
>> {
>> ? ? ?self->time = timestamp;
>> }
>>
>> fbt:ipc::return,
>> fbt:semsys::return,
>> fbt:genunix:sem*:return
>> /self->time/
>> {
>> ? ? ?this->name = strjoin(probeprov,
>>
strjoin(strjoin(":",probemod),strjoin(":",probefunc)));
>> ? ? ?@semcheck[this->name] = count();
>> ? ? ?self->time = 0;
>> }
>>
>> syscall::sem*:return
>> /self->time/
>> {
>> ? ? ?this->name = strjoin(probeprov,
strjoin("::",probefunc));
>> ? ? ?@semcheck[this->name] = count();
>> ? ? ?self->time = 0;
>> }
>>
>> tick-10sec
>> {
>> ? ? ?exit(0);
>> }
>>
>> If i modify the script, it also not working.
>>
>> root at thelab ~/Tools/IPC$ ./ipc_count_all.d
>>
>> ?fbt:genunix:sema_tryp ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
>> ?fbt:genunix:sema_destroy ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4
>> ?fbt:genunix:sema_init ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?14
>> ?fbt:genunix:sema_p ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 59
>> ?fbt:genunix:sema_v ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 60
>> ?fbt:ipc:ipc_lock_internal ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1850
>> ?fbt:ipc:ipcperm_access ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1850
>> ?fbt:semsys:sem_undo_add ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1850
>> ?fbt:semsys:sem_undo_compar ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1850
>> ?fbt:semsys:semsys ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1850
>> root at thelab ~/Tools/IPC$ cat ./ipc_count_all.d
>> #!/usr/sbin/dtrace -qs
>>
>> #pragma D option quiet
>> #pragma D option destructive
>>
>> fbt:ipc::entry,
>> fbt:semsys::entry,
>> fbt:genunix:sem*:entry,
>> syscall::sem*:entry
>> {
>> ? ? ?self->time = timestamp;
>> }
>>
>> fbt:ipc::return,
>> fbt:semsys::return,
>> fbt:genunix:sem*:return,
>> syscall::sem*:return
>> /self->time/
>> {
>> ? ? ?this->name = strjoin(probeprov,
>>
strjoin(strjoin(":",probemod),strjoin(":",probefunc)));
>> ? ? ?@semcheck[this->name] = count();
>> ? ? ?self->time = 0;
>> }
>>
>> tick-10sec
>> {
>> ? ? ?exit(0);
>> }
>>
>> I know i can use printa to print probeprov, probemod and probefunc but
>> i prefer strjoin :)
>> In this case i doesn''t understand where are syscall''
count.
>>
>> Anyone has an idea about this problem?
>>
>> Cni
>> _______________________________________________
>> dtrace-discuss mailing list
>> dtrace-discuss at opensolaris.org
>>
>
>
>
> --
> Adam Leventhal, Delphix
> http://dtrace.org/blogs/ahl
>
> 275 Middlefield Road, Suite 50
> Menlo Park, CA 94025
> http://www.delphix.com
>