2012-04-08 18 views
7

Nếu tôi chạy chương trình C/C++ trong gdb (sau khi biên dịch với cờ -g) và tôi kiểm tra địa chỉ của các biến, đối số ... vv, và sau đó chạy nó bên ngoài gdb (sử dụng ./) địa chỉ giống như những gì tôi thấy trong gdb? Nếu chúng khác nhau thì chúng thường giống nhau hoặc chúng sẽ khác nhau đáng kể?Sự khác biệt giữa địa chỉ gdb và địa chỉ "thực"?

Tôi hỏi điều này vì tôi có một chương trình tràn bộ đệm hoạt động hoàn hảo trong gdb (có và không có điểm ngắt), tuy nhiên khi tôi cố chạy nó bên ngoài gdb, nó không hoạt động.

+4

Về tràn bộ đệm của bạn, tôi khuyên bạn nên thử valgrind. – Troubadour

+1

Buộc chương trình kết xuất lõi bằng "ulimit -c unlimited", sau đó kiểm tra tệp lõi bằng gdb. – strkol

Trả lời

7

tôi kiểm tra các địa chỉ của biến nhất định, lập luận ... vv, và sau đó tôi chạy nó bên ngoài của gdb (sử dụng ./) các địa chỉ này sẽ được giống như những cái tôi đã thấy trong gdb

Nó phụ thuộc.

biến
  1. toàn cầu được định nghĩa trong thực thi chính sẽ ở cùng một địa chỉ (trừ trường hợp thực thi được xây dựng với -fpie và liên kết với -pie cờ.
  2. biến toàn cầu quy định tại các thư viện chia sẻ khác có thể có địa chỉ đáng kể khác nhau do ASLR.
  3. biến địa phương và các thông số có thể di chuyển xung quanh bởi nhiều K-byte do ASLR.
  4. Heap phân bổ biến cũng có thể quyết liệt di chuyển do ASLR, hoặc nếu chương trình của bạn là đa luồng.

Lưu ý rằng GDB trên Linux theo mặc định vô hiệu hóa ASLR, để thực hiện gỡ lỗi dễ dàng hơn. Bạn có thể bật lại ASLR theo GDB với set disable-randomization off. Điều đó có thể cho phép bạn tạo lại vấn đề theo GDB.

Tôi có một lỗi tràn bộ đệm

Cũng lưu ý, rằng các công cụ như ValgrindAddress Sanitizer thường đáng kể hiệu quả hơn cho việc tìm kiếm lỗi tràn bộ đệm hơn chạy dưới GDB. Địa chỉ Sanitizer nói riêng là tuyệt vời ở chỗ nó tìm thấy tràn bộ đệm trong hình cầu và trên ngăn xếp (Valgrind không).

0

Biên dịch với cờ -g tăng kích thước mã khi nó bung vào thông tin bổ sung có thể thực thi.

Đối với vấn đề bộ đệm của bạn, nó sẽ giúp xuất bản một đoạn mã nơi mọi thứ sắp hết.

2

Bạn không bao giờ nên giả định rằng một số mã hoặc vars nhất định sẽ được đặt tại một địa điểm cố định.

Điều này đúng trong quá khứ trong hầu hết hệ điều hành nhưng đó là lỗ hổng bảo mật. phần mềm độc hại sử dụng điều này để tăng cường các chương trình. Hệ điều hành sẽ có xu hướng tranh giành địa chỉ để tăng cường bảo mật.

+2

Tôi vừa đề cập đến [random random layout randomization (ASLR)] (http://en.wikipedia.org/wiki/Address_space_layout_randomization). – Blastfurnace

+0

Người ta có thể * an toàn * giả định rằng trong một tập tin thực thi phụ thuộc vào vị trí, tất cả các biến toàn cầu sẽ ở cùng một địa chỉ cố định từ một lần thực thi này đến một thực thi khác. –

+1

@ Sử dụng tiếng Nga: Tôi không mong đợi điều đó. Tại sao bạn nghĩ vậy? –