2013-03-07 21 views
5

Để tạo thực thi .out, tôi phải nhập:Lập trình C: Làm thế nào để sử dụng gdb với Makefile và các đối số dòng lệnh?

$: make 
$: myprogram.out name.ged 

chương trình của tôi kết hợp một đối số dòng lệnh, do đó "name.ged".

Bất cứ khi nào tôi chạy gdb sau khi nhận được một lỗi segmentation (core dumped), tôi nhập:

$: gdb a.out core 
(gdb): bt 

sau đó tôi sử dụng lệnh trace trở lại, và lợi nhuận gdb:

#0 0x4a145155 in ??() 
#1 0x08a16ce0 in ??() 

Tôi thậm chí đã cố gắng bằng cách sử dụng lệnh up t di chuyển lên stack, nhưng vẫn không có may mắn. Tôi không thể biết được dòng nào trong chương trình của tôi đang cho tôi lỗi seg. gdb làm việc với các chương trình khác của tôi không liên quan đến một đối số lệnh và Makefile, vì vậy tôi tự hỏi nếu các lệnh của tôi không chính xác.

+4

Bạn cần phải biên dịch với 'cờ -g'. Vì bạn chưa đăng Makefile nên tôi không thể giúp bạn thêm. –

+0

Vì vậy, lệnh sẽ là gcc -g myprogram.out name.ged? – Bonnie

+0

Trong tập tin thực hiện có một lệnh để biên dịch mã (gcc ...) Lệnh đó cần cờ -g để thêm thông tin bổ sung cho gdb hoạt động hiệu quả. –

Trả lời

7

Tóm tắt nhận xét (trước khi bất kỳ ai khác làm :).

Tệp thi hành của bạn thiếu thông tin biểu tượng mà gdb cần hiển thị mã nguồn có liên quan. Bạn cần thêm tùy chọn -g vào lệnh biên dịch và tạo một tệp thực thi mới. Sau đó chạy lại thử nghiệm không thành công của bạn để tạo một tệp lõi mới. gdb với thực thi này và lõi sẽ có thể hiển thị cho bạn chồng các cuộc gọi hàm sử dụng backtrace.

Trong tệp makefile, cách dễ nhất để thực hiện việc này là thêm (vào) biến số CFLAGS được sử dụng với quy tắc ẩn .o.c.

CFLAGS= -g -Wall -Wextra 

Bạn cũng có thể thêm trực tiếp điều này vào dòng lệnh (giả sử một trình bao phong nha :). Điều này đặt giá trị dưới dạng biến môi trường trong khi thực hiện lệnh make (và các lệnh phụ).

$ CFLAGS='-g -Wall -Wextra' make 

Tôi thực sự khuyên bạn nên thêm mã này vào bash .profile, vì vậy bạn luôn nhận được nhiều thông tin nhất từ ​​trình biên dịch.

CFLAGS='-Wall -Wextra' 

Sau đó, khi bạn cần đến nó, đặt này trong makefile để thực hiện một thi thể gỡ lỗi:

CFLAGS+= -g 
Các vấn đề liên quan