Hi all,
I am using DTrace to debug a signal related 32-bit program on Solaris
10(64-bit).
The source code of program is:
#include <stdio.h>
#include <signal.h>
struct sigaction act;
void handler(int a, siginfo_t *b, void *c)
{
}
int main(void)
{
act.sa_flags = 1;
act.sa_sigaction = handler;
sigemptyset(&act.sa_mask);
sigaction(SIGINT, &act, NULL);
printf("The address is 0x%x, sizeof(struct sigaction)
is %d\n", &act, sizeof(struct sigaction));
return 0;
}
The DTrace script is :
#!/usr/sbin/dtrace -Cs -32
#include <signal.h>
sigaction:entry
/pid == $target/
{
this->sig = (struct sigaction *)copyin(arg1,
sizeof(struct sigaction));
printf("pid is %d: arg0 is %d, arg1 is 0x%x, sa_flags
is %d, sa_sigaction is 0x%x\n",
pid,
arg0,
arg1,
(int)(this->sig->sa_flags),
(int)(this->sig->sa_sigaction));
printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
*((char*)this->sig),
*(((char*)this->sig) + 1), *(((char*)this->sig) + 2), *(((char*)this->sig) + 3),
*(((char*)this->sig) +
4), *(((char*)this->sig) + 5), *(((char*)this->sig) + 6), *(((char*)this->sig)
+ 7));
printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
*(((char*)this->sig) +
8), *(((char*)this->sig) + 9), *(((char*)this->sig) + 10), *(((char*)this->sig)
+ 11),
*(((char*)this->sig) +
12), *(((char*)this->sig) + 13), *(((char*)this->sig) + 14),
*(((char*)this->sig) + 15));
printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
*(((char*)this->sig) +
16), *(((char*)this->sig) + 17), *(((char*)this->sig) + 18),
*(((char*)this->sig) + 19),
*(((char*)this->sig) +
20), *(((char*)this->sig) + 21), *(((char*)this->sig) + 22),
*(((char*)this->sig) + 23));
printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
*(((char*)this->sig) +
24), *(((char*)this->sig) + 25), *(((char*)this->sig) + 26),
*(((char*)this->sig) + 27),
*(((char*)this->sig) +
28), *(((char*)this->sig) + 29), *(((char*)this->sig) + 30),
*(((char*)this->sig) + 31));
ustack();
}
The execute the command: "./trace.d -c ./a", and the output is:
bash-3.2# ./trace.d -c ./a
dtrace: script './trace.d' matched 6 probes
The address is 0x8060ea0, sizeof(struct sigaction) is 32
dtrace: pid 23721 has exited
CPU ID FUNCTION:NAME
2 58241 sigaction:entry pid is 23721: arg0 is 2,
arg1 is 0x8047760, sa_flags is 1, sa_sigaction is 0xffbffeff
0x1 0x0 0x0 0x0 0x4 0xe9 0xed 0xfe
0xff 0xfe 0xbf 0xff 0xff 0xff 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
libc.so.1`__sigaction+0x15
a`main+0x51
a`_start+0x80
The C program output the address of act is 0x8060ea0, but DTrace
outputs the address of act is 0x8047760. Furthermore, the data in 0x8047760
isn't same as C program has set.
Could anyone give any help or clues on this issue? Thanks very much in
advance!
Bets Regards
Nan Xiao
-------------------------------------------
dtrace-discuss
Archives: https://www.listbox.com/member/archive/184261/=now
RSS Feed: https://www.listbox.com/member/archive/rss/184261/25769126-e243886f
Modify Your Subscription:
https://www.listbox.com/member/?member_id=25769126&id_secret=25769126-8d47a7b2
Powered by Listbox: http://www.listbox.com