2015-02-24 112 views
0

我在gdb會話中啓動了Apache http server(版本2.4.12)。我踩着通過request.c模塊中的代碼,我打印出變量的內容這個內存地址包含什麼?

這是代碼

1546 AP_DECLARE(int) ap_file_walk(request_rec *r) 
1547 { 
1548  ap_conf_vector_t *now_merged = NULL; 
1549  core_dir_config *dconf = ap_get_core_module_config(r->per_dir_config); 
1550  ap_conf_vector_t **sec_ent = NULL; 
1551  int num_sec = 0; 

這是* R的輸出,我感興趣的是:

used_path_info = 2, 
    eos_sent = 0, 
    per_dir_config = 0x7fffe4251028, 
    request_config = 0x7fffe4258370, 
    log = 0x7ffff7fc1288, 
    log_id = 0x0, 

這是我所得到的,當我檢查per_dir_config

(gdb) print 0x7fffe4251028 
$99 = 140737021022248 
(gdb) x/s 0x7fffe4251028 
0x7fffe4251028: "\370\022%\344\377\177" 
(gdb) 

會這樣meone有時間向我解釋"\370\022%\344\377\177"是什麼?

+1

'r-> per_dir_config'是指向'ap_conf_vector_t'結構的指針。你得到的字符串是內容(部分,也許)。 – 2015-02-24 20:04:16

+0

它是一個由7個字符組成的序列,其中包括''\ 370',''\ 022','''',''\ 344',''\ 377',''\ 177 '',''\ 0''(終止的空字符是隱含的)。 GDB主要以八進制格式向你展示它們。這是最好的GDB能夠做到的:當你通過地址直接訪問內存時,它對數據類型一無所知。 – 2015-02-24 22:48:30

+0

爲什麼不直接使用print r-> per_dir_config? – dbrank0 2015-02-25 07:48:21

回答

0

該字符串"\370\022%\344\377\177"是當字符不可打印時,以八進制形式由r-> per_dir_config指向的core_dir_config結構的開頭。在十六進制,你將有:

\370 = 11 111 000 = f8 
\022 = 00 010 010 = 12 
% = (ascii value) = 25 
\344 = 11 100 100 = e4 
\377 = 11 111 111 = ff 
\177 = 01 111 111 = 7f 

根據其他指針的值,我猜你的計算機有一個小端處理器,所以你必須扭轉字節順序。的值則是:

0x7fffe42512f8 

它是由R-> per_dir_config指向的core_dir_config結構的d字段的值。 由於d是char *,因此您可以輸入x/s 0x7fffe42512f8來查看字符串。