Kết xuất lõi chỉ là kết xuất của bộ nhớ chương trình của bạn, nếu bạn biết mọi thứ ở đâu thì bạn có thể sử dụng nó.
Bạn sử dụng tệp thực thi vì nó giải thích nơi (về mặt địa chỉ logic) mọi thứ được đặt trong bộ nhớ, tức là tệp lõi.
Nếu bạn sử dụng một lệnh, objdump
nó sẽ kết xuất dữ liệu meta về đối tượng thực thi mà bạn đang điều tra. Sử dụng một đối tượng thực thi có tên a.out làm ví dụ.
objdump -h a.out
chỉ bỏ thông tin tiêu đề, bạn sẽ thấy các phần có tên, vd. .data hoặc .bss hoặc .text (còn nhiều nữa). Chúng thông báo cho trình tải hạt nhân trong đó trong các đối tượng có thể tìm thấy các phần khác nhau và ở đâu trong không gian địa chỉ tiến trình, phần đó sẽ được tải và đối với một số phần (ví dụ .data .text) những gì sẽ được tải. (phần .bss không chứa bất kỳ dữ liệu nào trong tệp nhưng nó đề cập đến dung lượng bộ nhớ dự trữ trong quy trình cho dữ liệu chưa được khởi tạo, nó chứa đầy các số không).
Bố cục của tệp đối tượng thực thi tuân theo tiêu chuẩn, ELF.
objdump -x a.out
- vứt bỏ mọi thứ
Nếu đối tượng thực thi vẫn chứa các bảng ký hiệu của nó (nó chưa bị tước - man strip
và bạn đã sử dụng -g
để tạo thế hệ gỡ lỗi để gcc
giả sử biên dịch nguồn ac), thì bạn có thể kiểm tra nội dung cốt lõi bằng tên ký hiệu, ví dụ: nếu bạn có biến / bộ đệm có tên inputLine trong mã nguồn của bạn, bạn có thể sử dụng tên đó gdb
để xem nội dung của nó. tức là gdb
sẽ biết phần bù từ khi bắt đầu phân đoạn dữ liệu khởi tạo chương trình của bạn nơi inputLine bắt đầu và độ dài của biến đó.
Đọc thêm Điều 1 ,
Điều 2 , và để biết thông số kỹ thuật Định dạng liên kết và định dạng thực thi (ELF) gritty gritty .
Cập nhật sau khi bình luận @mirabilos bên dưới.
Nhưng nếu sử dụng bảng ký hiệu như trong
$ gdb --batch -s a.out -c core -q -ex "x buf1"
Sản xuất
0x601060 <buf1>: 0x72617453
và sau đó không sử dụng bảng ký hiệu và kiểm tra địa chỉ trực tiếp trong,
$ gdb --batch -c core -q -ex "x 0x601060"
Sản xuất
0x601060: 0x72617453
Tôi đã kiểm tra bộ nhớ trực tiếp mà không sử dụng bảng ký hiệu trong lệnh thứ 2.
Tôi cũng thấy, câu trả lời của @ user580082 thêm vào phần giải thích và sẽ bỏ phiếu.