On Tue, Aug 25, 2009 at 05:37:26PM +0700, Dmitry Afanasyev wrote:
> Hello, Mike.
>
> Can you help me one more time, please.
>
> I wrote a simple C program, which just print string and its address. Here it
> is:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> #define MSG "Hello, World!"
>
> int main(int argc, char* argv[])
> {
> int length = strlen(MSG);
> char* message = malloc(length + 1);
> memcpy(message, MSG, length);
> message[length + 1] = 0;
>
> unsigned int address = (unsigned int) message;
>
> printf("Message is: %s\n", message);
> printf("Address is: %x\n", address);
>
> getchar();
>
> free(message);
>
> return EXIT_SUCCESS;
> }
>
> bash-3.00# cc -g -o test test.c
> bash-3.00# ./test
> Message is: Hello, World!
> Address is: 8060e90
>
> I want to translate the virtual address 8060e90 to the physical
> address with mdb.
> It is ok, when I just run mdb and print string by virtual address:
>
> bash-3.00# mdb -p `ps -a | pgrep test`
> Loading modules: [ ld.so.1 libc.so.1 ]
> > 8060e90/s
> 0x8060e90: Hello, World!
>
> But neither "::vtop", nor "\" works for me.
Those won't work when attached to a process; the process model doesn't export
that. You'll have to run MDB against the live kernel and do it from there:
% cat > tmpc.c <<EOF
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MSG "Hello, World!"
int
main(int argc, char *argv[])
{
char *message = strdup(MSG);
printf("Message: \"%s\" (0x%p)\n", message, message);
getchar();
return (0);
}
EOF
% cc -o tmpc tmpc.c
% ./tmpc & sleep 1
[2] 101948
*** note the PID
Message: "Hello, World!" (0x8061128)
*** note the virtual address address
[2] + 101948 suspended (tty input) ./tmpc
% su
Password:
# mdb -k
*** attach to the running kernel
Loading modules: [ ... ]
> 0t101948::pid2proc
*** uses the pid ("0t" indicates decimal)
ffffff0527e33398
> 0t101948::pid2proc | ::print proc_t p_as
p_as = 0xffffff01eca01d00
*** this gives the "address space" (as) for the process
> 0x8061128::vtop -a 0xffffff01eca01d00
virtual 8061128 mapped to physical 331a1128
*** Now we can print the string from the physical page
> 331a1128\s
0x331a1128: Hello, World!
>
Voila!
Cheers,
- jonathan
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code