Joel,

My research indicates that you will have to know the
offsets of the data you wish to examine through the this
pointer. It is not a C struct and DTrace does understand C++.

Attached is an example.

What must be identified is the location of the virtual function
table. On a simple object it is the first field. If you have
multiple inheritance there may be more than one.

arwen: make
CC -m64 -g  -c CCtest.cc
CC -m64 -g  -c TestClass.cc
CC -m64 -g -o CCtest CCtest.o TestClass.o
echo "Done."
Done.
arwen: dbx CCtest
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.7' in your .dbxrc
Reading CCtest
Reading ld.so.1
Reading libCstd.so.1
Reading libCrun.so.1
Reading libm.so.2
Reading libc.so.1
(dbx) stop in main                                                           
(2) stop in main
(dbx) run         
Running: CCtest 
(process id 2803)
stopped in main at line 10 in file "CCtest.cc"
   10           int i=0;
(dbx) n 
stopped in main at line 13 in file "CCtest.cc"
   13                   t = new TestClass(i);
(dbx) n 
stopped in main at line 14 in file "CCtest.cc"
   14                   t->a='a';
(dbx) n 
stopped in main at line 15 in file "CCtest.cc"
   15                   t->j=0xffff;
(dbx) n 
stopped in main at line 16 in file "CCtest.cc"
   16                   cout << t->ClassName();
(dbx) n 
Integer = 0stopped in main at line 17 in file "CCtest.cc"
   17                   t->setname((const char *)"Goodbye.");
(dbx) n 
stopped in main at line 18 in file "CCtest.cc"
   18                   cout << t->ClassName() << endl;
(dbx) n 
Goodbye.
stopped in main at line 19 in file "CCtest.cc"
   19                   sleep(5);
(dbx) 
(dbx) print t
t = 0x4175b0
(dbx) print &t
&t = 0xfffffd7fffdfeb30
(dbx) print *t
*t = {
    a   = 'a'
    j   = 65535
    str = 0x41cbe0 "Goodbye."
}
(dbx) examine t/20
0x00000000004175b0:      0x00412870 0x00000000 0x00000061 0x0000ffff
0x00000000004175c0:      0x0041cbe0 0x00000000 0x00000000 0x00000000
0x00000000004175d0:      0x00000020 0x00000000 0x00000000 0x00000000
0x00000000004175e0:      0x00417600 0x00000000 0x00000000 0x00000000
0x00000000004175f0:      0x00000000 0x00000000 0x00000000 0x00000000
=========================================================
less str.d
#!/usr/sbin/dtrace -Cs
typedef struct TestClass
{
                void *ptr;
                char a;
                int j;
                char *str;
}TestClass_t;

pid$target::__1cJTestClassHsetname6Mpkc_i_:entry
{
/* this->str = *(uintptr_t *)copyin(arg1, sizeof(void *)); */
 this->ptr = arg0; /* this pointer */
 printf("\n this ptr = %p\n", this->ptr);
 this->sptr=(TestClass_t *)copyin(this->ptr, sizeof(TestClass_t));
 printf("\n this my_ptr = %p\n", ((TestClass_t *)this->sptr)->ptr);
 printf("\n this my_char = %c\n", ((TestClass_t *)this->sptr)->a);
 printf("\n this my_int = %d\n", ((TestClass_t *)this->sptr)->j);
 printf("\n this my_str_ptr = %p\n", ((TestClass_t *)this->sptr)->str);
 printf("\n this my_str = %s \n", copyinstr((uintptr_t)((TestClass_t 
*)this->sptr)->str));
 this->str = copyinstr(arg1);
 printf("\nnew string = %s\n", this->str);
}

=========================================================
arwen: str.d -c CCtest
dtrace: script 'str.d' matched 1 probe
Integer = 0Goodbye.
CPU     ID                    FUNCTION:NAME
  0  83901 __1cJTestClassHsetname6Mpkc_i_:entry 
 this ptr = 4175b0

 this my_ptr = 412870

 this my_char = a

 this my_int = 65535

 this my_str_ptr = 435d10

 this my_str = Integer = 0 

new string = Goodbye.

Integer = 1Goodbye.
  1  83901 __1cJTestClassHsetname6Mpkc_i_:entry 
 this ptr = 4175b0

 this my_ptr = 412870

 this my_char = a

 this my_int = 65535

 this my_str_ptr = 435d10

 this my_str = Integer = 1 

new string = Goodbye.

rick


 
-- 

Rickey C. Weisner 
Software Development and Performance Specialist 
Principal Field Technologist
Systems Quality Office
cell phone: 615-308-1147
email: rick.weis...@sun.com

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "TestClass.h"

int main(int argc, char **argv)
{
        TestClass *t;
        int i=0;

        while (1) {
                t = new TestClass(i);
                t->a='a';
                t->j=0xffff;
                cout << t->ClassName();
                t->setname((const char *)"Goodbye.");
                cout << t->ClassName() << endl;
                sleep(5);
                delete t;
                i++;
        }
}
OBJS=CCtest.o TestClass.o
PROGS=CCtest

CC=CC -m64

all: $(PROGS)
        echo "Done."

clean:
        rm $(OBJS) $(PROGS)

CCtest: $(OBJS) TestClass.h
        $(CC) -g -o CCtest $(OBJS)

.cc.o: TestClass.h
        $(CC) -g $(CFLAGS) -c $<

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "TestClass.h"

TestClass::TestClass() {
        str=strdup("empty.");
}

TestClass::TestClass(const char *name) {
        str=strdup(name);
}
int TestClass::setname(const char *name) {
   if ( str ) free(str);
        str=strdup(name);
        return 0;
}

TestClass::TestClass(int i) {
        str=(char *)malloc(128);
        sprintf(str, "Integer = %d", i);
}

TestClass::~TestClass() {
        if ( str )
                free(str);
}

char *TestClass::ClassName() const {
        return str;
}
class TestClass
{
        public:
                TestClass();
                TestClass(const char *name);
                TestClass(int i);
                int setname(const char *name);
                virtual ~TestClass();
                virtual char *ClassName() const;
                char a;
                int j;
        private:
                char *str;
};
#!/usr/sbin/dtrace -Cs
typedef struct TestClass
{
                void *ptr;
                char a;
                int j;
                char *str;
}TestClass_t;

pid$target::__1cJTestClassHsetname6Mpkc_i_:entry
{
/* this->str = *(uintptr_t *)copyin(arg1, sizeof(void *)); */
 this->ptr = arg0; /* this pointer */
 printf("\n this ptr = %p\n", this->ptr);
 this->sptr=(TestClass_t *)copyin(this->ptr, sizeof(TestClass_t));
 printf("\n this my_ptr = %p\n", ((TestClass_t *)this->sptr)->ptr);
 printf("\n this my_char = %c\n", ((TestClass_t *)this->sptr)->a);
 printf("\n this my_int = %d\n", ((TestClass_t *)this->sptr)->j);
 printf("\n this my_str_ptr = %p\n", ((TestClass_t *)this->sptr)->str);
 printf("\n this my_str = %s \n", copyinstr((uintptr_t)((TestClass_t 
*)this->sptr)->str));
 this->str = copyinstr(arg1);
 printf("\nnew string = %s\n", this->str);
}
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to