2011-09-01 20 views
24

Có cách nào để xác định loại dữ liệu mới (cấu trúc C hoặc công đoàn) trong gdb hay không. Ý tưởng là để xác định một cấu trúc và sau đó làm cho dữ liệu in gdb từ một địa chỉ được hiểu là cấu trúc mới được xác định.Chúng tôi có thể xác định loại dữ liệu mới trong phiên GDB

Ví dụ: giả sử chúng tôi có cấu trúc mẫu.

struct sample { 
    int i; 
    struct sample *less; 
    struct sample *more; 
} 

Và nếu 0x804b320 là địa chỉ của mảng struct sample. Hệ nhị phân không có thông tin gỡ lỗi để gdb hiểu được struct sample. Có cách nào để xác định struct sample trong phiên gdb không? Vì vậy mà chúng ta có thể in p *(struct sample *)0x804b320

Trả lời

38

Vâng, ở đây là làm thế nào để làm cho công việc này:

// sample.h 
struct sample { 
    int i; 
    struct sample *less; 
    struct sample *more; 
}; 

// main.c 
#include <stdio.h> 
#include <assert.h> 
#include "sample.h" 
int main() 
{ 
    struct sample sm; 
    sm.i = 42; 
    sm.less = sm.more = &sm; 

    printf("&sm = %p\n", &sm); 
    assert(sm.i == 0); // will fail 
} 

gcc main.c # Note: no '-g' flag 

gdb -q ./a.out 
(gdb) run 
&sm = 0x7fffffffd6b0 
a.out: main.c:11: main: Assertion `sm.i == 0' failed. 

Program received signal SIGABRT, Aborted. 
0x00007ffff7a8da75 in raise() 
(gdb) fr 3 
#3 0x00000000004005cc in main() 

Không biến địa phương, không có loại struct sample:

(gdb) p sm 
No symbol "sm" in current context. 
(gdb) p (struct sample *)0x7fffffffd6b0 
No struct type named sample. 

Vì vậy, chúng tôi bắt đầu làm việc:

// sample.c 
#include "sample.h" 
struct sample foo; 

gcc -g -c sample.c 

(gdb) add-symbol-file sample.o 0 
add symbol table from file "sample.o" at 
    .text_addr = 0x0 

(gdb) p (struct sample *)0x7fffffffd6b0 
$1 = (struct sample *) 0x7fffffffd6b0 
(gdb) p *$1 
$2 = {i = 42, less = 0x7fffffffd6b0, more = 0x7fffffffd6b0} 

Voilà!

+1

Lén lút. Tôi thích nó. –

Các vấn đề liên quan