Làm cách nào để tự động chạy tệp thực thi trong GDB?


88

Tôi muốn gdbchạy ngay tệp thực thi, như thể tôi đã nhập "run" (động lực: Tôi không thích nhập "chạy").

Một cách là viết câu lệnh gdbnhư sau:

$ echo run | gdb myApp

Nhưng vấn đề với cách tiếp cận này là bạn mất tương tác với gdb, ví dụ. nếu một điểm ngắt kích hoạt hoặc myAppbị treo, hãy gdbthoát. Phương pháp này được thảo luận ở đây .

Nhìn vào các tùy chọn trong --help, tôi không thấy cách nào để làm điều này, nhưng có lẽ tôi đang thiếu một cái gì đó.

Câu trả lời:


124
gdb -ex run ./a.out

Nếu bạn cần chuyển đối số cho a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

CHỈNH SỬA: Orion cho biết điều này không hoạt động trên Mac OSX.

Các -exlá cờ đã có sẵn từ GDB-6.4(phát hành năm 2005), nhưng OSX sử dụng nĩa của GDB của Apple, và XCode mới nhất cho Leopard chứa GDB 6.3.50-20050815 (Apple version gdb-967), vì vậy bạn đang trên may mắn.

Xây dựng GDB-7.0.1bản phát hành hiện tại là một trong những giải pháp khả thi. Chỉ cần chắc chắn để đọc này .


1
cảm ơn vì câu trả lời. dòng đó hoạt động giống như chỉ "gdb ./a.out" cho tôi tho.
orion elenzil

3
Tôi vừa xác nhận rằng bạn cũng có thể chuyển nhiều tùy chọn -ex trên dòng lệnh và chúng sẽ chạy theo thứ tự trước khi chuyển đầu vào gdb cho bạn.
Tung Nguyen

Giải pháp này không có tác dụng nếu chương trình có lập luận như sau:./a.out a b
gigilibala

vì OSX / xcode không còn hỗ trợ gdb ra khỏi hộp nữa (lldb là gdb mới), điều này hiện có vẻ là cách tiếp cận tốt hơn.
orion elenzil

Tôi đã tạo một tệp lệnh và sử dụng gdb -xtrên hệ thống Linux. OS X sử dụng LLVMtiếng kêu nên hãy kiểm tra khả năng gỡ lỗi của lldb.
Daisuke Aramaki

22

Tôi sẽ sử dụng gdb-script:

gdb -x your-script

nơi tập lệnh của bạn chứa một cái gì đó như:

file a.out
b main
r

sau đó bạn có lời nhắc gdb tương tác bình thường

CHỈNH SỬA :

đây là một cách tối ưu hóa cho những người thực sự lười biếng:

  1. lưu tập lệnh như .gdbinittrong working directory.
  2. Sau đó, bạn chỉ cần chạy gdb như

    gdb

... và gdb tự động tải và thực thi nội dung của .gdbinit.


này, cảm ơn vì câu trả lời. trông giống như những gì tôi muốn ngoại trừ tôi không nhận được lời nhắc gdb, tôi nhận được gdb bị tạm ngưng và tôi quay lại dòng lệnh như thể tôi đã nhập "ctrl-z". nếu tôi "fg", thì gdb sẽ tiếp tục và ứng dụng sẽ chạy. đây là OS X.
orion elenzil

orion: mmmh - điều đó thật ngạc nhiên đối với tôi. Hoạt động tốt với mọi phiên bản UNIX mà tôi thực sự đang sử dụng (Linux, Solaris, AIX). Bạn đang sử dụng phiên bản gdb nào?

Tôi vừa xác minh lại hành vi của điều này - vẫn đưa tôi đến dòng lệnh w / gdb bị treo. GNU gdb 6.3.50-20050815 (Apple phiên bản gdb-1518) (Thứ Bảy ngày 12 tháng 2 02:52:12 UTC 2011).
orion elenzil

@orionelenzil Không biết tại sao, nhưng nếu bạn đặt fgsau rdòng, nó hoạt động rất lành mạnh
dbr

Các startlệnh cung cấp một phím tắt cho b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli郝海东冠状病六四事件法轮功

20
(echo r ; cat) | gdb a.out

Con mèo cho phép bạn tiếp tục nhập sau khi gdb ngắt.


ồ, tuyệt vời. bạn phải ctrl-c sau khi thoát gdb để ngăn con mèo, nhưng điều đó thật tuyệt.
orion elenzil

3
Có vẻ như bạn mất một số phím kiểm soát trên phiên bản gdb bằng cách sử dụng này.
Treviño

Hơn nữa, những câu hỏi như Make breakpoint pending on future shared library load? (y or [n])sẽ tự động giả định câu trả lời là "Không".
Ruslan

6

start chỉ huy

Lệnh này là một lựa chọn tốt khác:

gdb -ex start --args ./a.out arg1 arg2

Nó giống như chạy, nhưng cũng đặt một điểm ngắt tạm thời tại mainvà dừng ở đó.

Điểm ngắt tạm thời này sẽ bị vô hiệu hóa sau khi nó bị tấn công.

starti

Ngoài ra còn có một liên quan startibắt đầu chương trình và dừng lại ở lệnh đầu tiên, hãy xem thêm: Dừng ở lệnh mã máy đầu tiên trong GDB

Tuyệt vời khi bạn đang làm một số công việc cấp thấp.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.