2013-02-20 33 views
8

Tôi đang thực hiện một chương trình C cơ bản bằng gdb. Tôi có điểm dừng ở đầu số main(). Sau khi chạy mã, gdb ngắt tại main() như mong đợi. Bây giờ nếu tôi kiểm tra sổ đăng ký con trỏ ngăn xếp (RSP), tôi nhìn thấyLấy con trỏ ngăn xếp hiện tại từ/proc/pid/stat

0x7fffffffe170: 0x00000000. 

Khi tôi lấy thông tin tương tự sử dụng cat /proc/17232/stat | cut -d" " -f29/proc (nơi 17.232 được pid cho quá trình này), tôi nhìn thấy:

140737488347112 (which in hex is: 0x7fffffffdfe8). 

Làm cách nào chúng ta thấy giá trị khác của con trỏ ngăn xếp hiện tại từ gdb. Và cũng có thể, tại sao gdb hiển thị nội dung của rsp là NULL (0x00000000)?

Cảm ơn.

Trả lời

2

In các RSP đăng ký (trên 64b cpu) từ /proc

(gdb) info register rsp 
rsp   0x7fffffffe480 0x7fffffffe480 

thật sự mang một giá trị khác so với một trong những từ /proc

[email protected]:~$ cat /proc/22219/stat | cut -d" " -f29 | perl -e 'print(sprintf("%x\n",<>));' 
7fffffffe338 

từ gdb có để buộc một interruption trong chương trình ở đầu chức năng chính chính theo thứ tự để tiếp nhận việc thực hiện và một tập hợp dữ liệu tối thiểu (địa chỉ trả về, một số đăng ký sao lưu) được lưu vào ngăn xếp. gdb sau đó, sử dụng ngăn xếp của chính nó không làm tràn chương trình và thực hiện các thao tác điều chỉnh cần thiết khi bạn yêu cầu xem thanh ghi hoặc làm việc trên dữ liệu ngăn xếp - và không hiển thị chế độ nấu ăn nội bộ gdb. Tuy nhiên /proc hiển thị dữ liệu thực, không thay đổi.

Các "thật" RSP từ /proc thực sự là hơi ít so với gdb một, vì trên x86 CPU stack phát triển xuống phía dưới.

Đối với giá trị null, nó đã không xảy ra trong quá trình thử nghiệm của tôi

(gdb) x 0x7fffffffe480 
0x7fffffffe480: 0xffffe578 
+0

Cảm ơn bạn đã làm rõ. Sẽ cố gắng tìm ra lý do tại sao bộ nhớ được hiển thị là null trong thử nghiệm của tôi. –

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