2010-03-18 36 views
7

Tôi có câu hỏi về gỡ lỗi chương trình C++ đang chạy trong Linux. Nếu một chương trình đã chạy và không thể bị gián đoạn, làm thế nào để làm điều đó.Làm cách nào để gỡ lỗi chương trình C++ đang chạy trong Linux?

Tôi có thể tìm thấy ba cách, nhưng tôi không biết nhiều về chi tiết, tôi biết ơn nếu có ai có thể xây dựng nó sâu hơn.

1), chúng tôi có thể sử dụng GDB bằng cách xác định quá trình ID

gdb -p PID 

Trong trường hợp này, sự khác biệt giữa điều này và attach PID là gì?

2) Chúng ta có thể sử dụng pstat, tuy nhiên, tôi đang sử dụng Ubuntu, không pstat, nhưng chỉ mpstat

dường như mpstat không cung cấp quá nhiều thông tin, và không quá nhiều lựa chọn.

3) kiểm tra thông tin chi tiết trong thư mục ./proc

Trong trường hợp này, chỉ cần chuyển đến thư mục có PID. Tuy nhiên, điều này có nên được thực hiện một cách mannually không?

+0

Tôi không nghĩ mình đã từng thấy tùy chọn '-p'. Gắn bó với một quá trình bằng PID là rất phổ biến mặc dù. Chính xác thì vấn đề gì với việc đó? – Cascabel

+0

Tôi không chắc câu hỏi của bạn thực sự là gì. Bạn dường như đã có phương pháp làm việc để gỡ lỗi một chương trình C++, do đó tiêu đề của bạn tự trả lời, và sau đó bài đăng của bạn yêu cầu một cái gì đó không liên quan. Bạn có thể diễn đạt lại tiêu đề hoặc câu hỏi của bạn để rõ ràng hơn không? – ephemient

+0

Tôi đã sử dụng 'strace -p PID' để theo dõi các cuộc gọi hệ thống của một ứng dụng C++ đang chạy. Tôi thấy rằng một cuộc gọi đến 'open()' đã bị lỗi và trường hợp lỗi không được xử lý một cách thích hợp. – jschmier

Trả lời

2

Tôi không thể tìm thấy tùy chọn -p trong gdb man hoặc tài liệu của họ, nhưng nó hoạt động! Tôi đã thử nó nhiều lần với các phiên bản cũ hơn trên RedHat và 7.0.1 trên Debian.

Tôi không chắc chắn chính xác nó tìm ra exe bằng PID (có thể là /proc/<PID>/exe), nhưng có. Vì nó không được mô tả trong tài liệu của họ, có lẽ nó không phải là cách được đề nghị nhiều nhất, nhưng tôi đã không có bất kỳ vấn đề với nó.

Không có sự khác biệt đáng chú ý giữa gdb -p <PID> và chạy gdb và trong quá trình nhập shell của chúng attach <PID>.

Cá nhân tôi thích ps xa| grep myprogram để nhận được PID

1

Liên quan đến kỹ thuật 1, không có -p cờ và bạn vẫn cần tên của chương trình:

gdb prog PID 

Không có sự khác biệt giữa làm điều đó vs chạy gdb prog và sau đó nói với gdb attach pid.

1

Sử dụng ps -ef | grep <your program> để lấy PID. Sau đó, chạy gdb <your program> <PID>. pstat không phải là lệnh chuẩn. Tôi chỉ sử dụng nó với Solaris.

ví dụ:

[email protected]:~/FE/bin> ./fe& 
[1] 5866         
[email protected]:~/FE/bin> ps -ef | grep fe 
gayan  5866 5836 2 10:19 pts/3 00:00:00 ./fe 
gayan  5871 5836 0 10:19 pts/3 00:00:00 grep fe 
[email protected]:~/FE/bin> gdb fe 5866 
GNU gdb (GDB; openSUSE 11.1) 6.8.50.20081120-cvs  
Copyright (C) 2008 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it.   
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details.            
This GDB was configured as "i586-suse-linux".         
For bug reporting instructions, please see:         
<http://bugs.opensuse.org/>...            
Attaching to program: /home/gayan/FE/bin/fe, process 5866 

Ở trên được chạy trên openSuse nhưng nên hoạt động trên Ubuntu.

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