2012-05-04 20 views
35

Tôi chạy một chương trình với LD_PRELOADing một thư viện riêng biệt. Như thế này.Cách sử dụng gdb với LD_PRELOAD

LD_PRELOAD=./my.so ./my_program 

Làm cách nào để chạy chương trình này bằng gdb?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - có gì giúp đỡ không? – Mat

Trả lời

52

Làm như sau.

gdb your_program 

(gdb) set environment LD_PRELOAD ./yourso.so 
(gdb) start 
0

Bạn về cơ bản có thể làm điều đó theo cùng một cách, chỉ cần thêm gdb trước tên chương trình:

LD_PRELOAD=./my.so gdb ./my.program 

Bạn có thể kiểm tra các biến môi trường sử dụng:

(gdb) show environment LD_PRELOAD 

Trong trường hợp hiếm bạn thực sự cần phải thay đổi nó bên trong gdb, ví dụ khi gỡ lỗi một số dlopen(), bạn ca làm điều đó:

(gdb) set environment LD_PRELOAD ./my.so 

Ồ, đợi đã, nó không có tác dụng với gdb 7.6.2! Thư viện không được tải, điều đó có nghĩa là không có câu trả lời nào ở đây hoàn toàn chính xác, ít nhất là với các công cụ hiện tại.

+0

Tôi đoán rằng hiệu ứng của preload là không mong muốn cho GDB chính nó (có lẽ nó là một thư viện mocking mà sửa đổi 'mở()' và như thế - chẳng hạn như 'fakeroot' vv). –

5

viết bài bởi vì chúng tôi chạy vào một trường hợp set environment đã không làm việc:

Từ GDB documentation:

set exec-wrapper wrapper 
show exec-wrapper 
unset exec-wrapper 

Khi 'exec-wrapper' được thiết lập, các wrapper quy định được sử dụng để ra mắt chương trình gỡ lỗi. gdb bắt đầu chương trình của bạn với một lệnh shell của chương trình wrapper mẫu exec. Trích dẫn được thêm vào chương trình và các đối số của nó, nhưng không được thêm vào trình bao bọc, vì vậy bạn nên thêm dấu ngoặc kép nếu thích hợp cho trình bao của bạn. Trình bao bọc chạy cho đến khi nó thực thi chương trình của bạn, và sau đó gdb kiểm soát.

Bạn có thể sử dụng bất kỳ chương trình nào mà cuối cùng cuộc gọi thực hiện với đối số của nó dưới dạng trình bao bọc. Một số tiện ích tiêu chuẩn của Unix thực hiện điều này, ví dụ: env và nohup. Bất kỳ tập lệnh shell Unix nào kết thúc với exec "$ @" cũng sẽ hoạt động.

Ví dụ, bạn có thể sử dụng env để vượt qua một biến môi trường vào chương trình sửa lỗi, mà không cần thiết lập các biến trong môi trường shell:

  (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' 
     (gdb) run 
4

Dưới đây là một cách để chạy tất cả mọi thứ (với lập luận và môi trường) là một lệnh:

Ví dụ:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l 

Các quan sát viên quan tâm sẽ nhận thấy rằng env phục vụ ở đây như là một wrapper exec (như câu trả lời của Alexey Romanov).

1

Bạn có thể cung cấp env như một exec-wrapper trên dòng lệnh bằng cách sử dụng -iex cờ:

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program 
+0

phiên bản này hoạt động tốt khi một số câu trả lời khác không hoạt động hoặc không dễ sử dụng. – Guillaume

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