17

Với g ++ với -g option, tôi có thể sử dụng gdb cho mục đích gỡ lỗi.Tùy chọn -g của g ++ tương đương với trình biên dịch cl VS2010?

Tương đương với tùy chọn này với trình biên dịch cl.exe Visual Studio 2010 là gì?

page có các thư viện khác nhau (gỡ lỗi/phát hành) để liên kết.

Nếu tôi biên dịch với tùy chọn gỡ lỗi bằng cl.exe, tôi có phải sử dụng các tùy chọn liên kết thư viện tương ứng (/ MD/MT vs/MDd/MTd) không?

Trả lời

29

Có một vài phần riêng biệt cho câu hỏi này: cách trình biên dịch/trình liên kết tạo và lưu giữ "thông tin gỡ lỗi" (ánh xạ giữa mã nguồn và mã đối tượng), cách trình biên dịch biên dịch mã khác làm cho việc gỡ rối dễ dàng hơn (suy nghĩ về assert() và #ifdef _DEBUG) và liệu các thư viện biên dịch sẵn mà bạn liên kết vào dự án của bạn có bao gồm thông tin gỡ lỗi hay không.

-Zi (gắn cờ trình biên dịch CL để thông báo để tạo thông tin gỡ lỗi) tương đương với cờ gg của gcc.

(Có các hình thức khác của tùy chọn -Z: -ZI nếu bạn muốn hỗ trợ "chỉnh sửa và tiếp tục" trong Visual Studio IDE, nhưng nếu bạn đang sử dụng IDE, bạn có thể đang sử dụng giao diện của nó cài đặt trình biên dịch thay vì thao tác chúng trực tiếp và -Z7 nếu bạn muốn thông tin gỡ lỗi định dạng CodeView cũ; bất cứ khi nào tôi gọi CL trực tiếp, nó luôn là -Zi mà tôi muốn.)

Lưu ý rằng sử dụng -Zi (hoặc -ZI) sẽ tạo một tệp .pdb trên mỗi thư mục, thường là khi bạn liên kết mã với nhau, nó có thể đến từ các tệp .obj được biểu diễn trong các tệp .pdb khác nhau và bạn cũng muốn kết hợp các tệp .pdb riêng biệt đó vào một cái tổng thể đại diện cho mã bạn đã liên kết với nhau - đây là điều mà công cụ chuyển đổi -debug cho trình liên kết là cho.

Cũng lưu ý: điều này nghe có vẻ phản trực giác, nhưng luôn sử dụng -Zi (đối với CL) và -debug (đối với link.exe). Ngay cả đối với mã bạn sẽ phát hành. Nó không làm tăng kích thước của tệp thực thi của bạn, hoặc cung cấp các bí mật cho khách hàng của bạn, vì thông tin gỡ rối đi trong một tệp .pdb riêng biệt (mà bạn sẽ không gửi cho khách hàng). Nếu có bất kỳ cơ hội nào bạn sẽ phải gỡ lỗi nó, bạn sẽ muốn .pdb. (-Zi thậm chí không tương thích với các tối ưu hóa, mặc dù -ZI là. Vì vậy, bạn có thể muốn biên dịch các bản dựng "debug" của bạn với -ZI, và bản phát hành "release" của bạn với "-Zi -O2".)

Đối với các thư viện: bạn không cần phải khớp đúng thuộc tính gỡ lỗi/phát hành của thư viện thời gian chạy C với mã của bạn có bao gồm thông tin gỡ lỗi hay không, nhưng thường là một ý tưởng hay - nếu bạn định gỡ lỗi dự án bạn muốn để có thể gỡ lỗi tất cả, và nếu bạn không gỡ lỗi nó, bạn không cần thêm trọng lượng. Việc sử dụng các phiên bản gỡ lỗi/phát hành của một thư viện nhất định sẽ không ảnh hưởng đến việc nó có sẵn các biểu tượng gỡ lỗi hay không (hy vọng, nếu ai biên soạn thư viện hiểu điểm tôi đã làm ở đoạn trước), nhưng nó sẽ ảnh hưởng đến những thứ như khẳng định và thêm #ifdef _DEBUG mã trong thư viện đó.

Điều này phù hợp với tất cả các thư viện bạn liên kết, nhưng đặc biệt đối với thư viện thời gian chạy C - Microsoft đã thêm mã phát hiện lỗi bổ sung vào malloc() và miễn phí(). Vì vậy, nếu bất cứ điều gì trong dự án của bạn đang sử dụng các hương vị gỡ lỗi của thư viện CRT, tất cả nó nên được.

Tùy chọn/M (/ MTd và/MDd) là lạ và kỳ diệu, theo ý kiến ​​của tôi - chúng chỉ là bí danh cho một tập hợp phức tạp các nội dung khác đang diễn ra đằng sau hậu trường. Lấy/MDd chẳng hạn, được ghi thành "Định nghĩa _DEBUG, _MT và _DLL và làm cho ứng dụng của bạn sử dụng phiên bản gỡ lỗi đa luồng và DLL cụ thể của thư viện thời gian chạy. Nó cũng làm cho trình biên dịch đặt tên thư viện là MSVCRTD. lib vào tệp .obj. " Ở đây, nó ảnh hưởng đến cả bộ tiền xử lý (định nghĩa _DEBUG và một số ký hiệu tiền xử lý khác) và trình liên kết (nó thực sự đặt một chú thích #pragma (trình liên kết) trong mã nguồn của bạn). Nếu bạn quan tâm về những gì đang xảy ra và không hiểu nó, điều này có thể gây ra vấn đề thực sự - Tôi đã nhìn thấy rất nhiều dự án không sử dụng IDE bị sa lầy trong cảnh báo về cả msvcrt.lib và msvcrtd.lib được liên kết trong, vv Bởi thời gian bạn hiểu làm thế nào để sử dụng (/ M tùy chọn) một cách an toàn, bạn không thực sự cần chúng nữa! Tôi thích làm cho mọi thứ rõ ràng hơn: chỉ định "-D _DEBUG" trực tiếp nơi tôi cần, chỉ định thư viện nào liên kết với rõ ràng (và sử dụng -nodefaultlib), và sau đó các tùy chọn/M là không cần thiết.

+4

+1 Wow. Tôi có thể hỏi làm thế nào bạn trở thành quen thuộc với các idiosyncrasies của Microsoft toolchain? :) –

+9

Năm và nhiều năm sử dụng các phiên bản khác nhau của MSVC, rất nhiều dự án đa nền tảng nên chúng tôi sử dụng makefiles hoặc bỏ qua hệ thống xây dựng của IDE, sử dụng thư viện mã nguồn mở được xây dựng bởi bên thứ ba, giữ toàn bộ công việc trên nâng cấp lên phiên bản mới của MSVC hoặc SDK, v.v. :) – metamatt

6

Bạn đang tìm kiếm một trong số debug information generation options (/Z7, /Zi hoặc /ZI).

Nếu bạn sử dụng một trong số đó, bạn cũng nên chuyển tùy chọn /DEBUG cho trình liên kết.

Bạn cũng sẽ cần liên kết với debug version thư viện thời gian chạy (/MDd hoặc /MTd). Điều này quan trọng vì các phiên bản này khác với các phiên bản phát hành của chúng (ví dụ: các thường trình cấp phát bộ nhớ của chúng không tương thích).

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