2013-03-17 39 views
12

Tôi đang cố gắng gỡ lỗi một số cơ chế fork() với eclipse cdt (Juno). tôi đã viết chương trình trong C.Gỡ lỗi fork() trong eclipse cdt

if(-1 == (pid = fork())) /* error */ 
    goto cleanup; 
    else if (0 == pid) /* child */ 
    { 
    execlp("gcc", "gcc", cFilePath, "-o" , GCC_OUTPUT_FILE_NAME, NULL); 
    goto cleanup; /* Arrives here only on error! */ 
    } 
    else if (pid > 0) /* parent - checks: correct pid returns, returns normally, with exit status = 0*/ 
    { 
     returnedpid = wait(exitStatus); 
     if(pid != returnedpid || exitStatus == NULL || !WIFEXITED(*exitStatus) || !WEXITSTATUS(*exitStatus)) 
      goto cleanup; 
    } 

Tôi cố gắng thêm "set follow-fork-mode child" như đã nói ở đây: http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00435.html

1. Làm thế nào tôi có thể gỡ lỗi phần mã nơi (0==pid)?

2. Khi tôi nhận được câu lệnh chờ, trình gỡ lỗi chỉ trở lại ngay lập tức, không phải là chờ() giả sử tạm dừng cho đến khi trẻ trở về? Tại sao nó trở lại ngay lập tức?

Trả lời

13

Sự cố của bạn có thể do "tháo rời trên ngã ba" được đặt thành tắt. DSF thiết lập điều này theo mặc định (nó cũng là mặc định của gdb).

1) Đặt điểm ngắt trên đường bằng "execlp ..." và "returnpid = ...". 2) Trong cấu hình gỡ lỗi cho phép "chế độ không ngừng" và "tự động gỡ lỗi quá trình chia hai". 3) Bắt đầu phiên gỡ lỗi. Bạn sẽ đạt điểm ngắt ở trẻ em hoặc cha mẹ. Bây giờ hãy xem chế độ xem gỡ lỗi.

Debug view

Bạn sẽ thấy nhị phân hiển thị hai chuỗi.

4) Nhấp vào một hoặc khác (các dòng có chính() trong hình trên) để chuyển ngữ cảnh gỡ lỗi.

+0

Hi dbrank0. Tôi theo ví dụ của bạn và tìm thấy nó làm việc (nhưng bạn cần phải buộc "Tự động gỡ lỗi quá trình phân nhánh" tùy chọn) nhưng với một vấn đề anyway. Tôi là "daemonizing" quá trình của tôi như vậy, theo chỉ dẫn rất kinh nghiệm, tôi đang cố gắng hai lần. Dường như với tôi rằng ngã ba đầu tiên được theo đúng cách nhưng ngay sau khi tôi cố gắng để ngã ba lần thứ hai toàn bộ trình gỡ lỗi bị treo và tôi không thể làm theo không ai trong số hai quy trình. cảm ơn anyway nhưng ... bất kỳ ý tưởng? –

+0

Không, xin lỗi, nhưng hãy xem nếu có bất kỳ thiết bị chuyển mạch được giải thích trong chương "gỡ lỗi dĩa" (https://sourceware.org/gdb/onlinedocs/gdb/Forks.html) giúp. – dbrank0

+0

Hoạt động hoàn hảo, ngay cả sau execvp (hoán đổi quá trình mới) sau ngã ba. Tốt đẹp. –

1

Có thể là do quá trình init gặt hái con trước khi bạn đợi. Hãy thử chặn sigchld khi bạn đi vào ngã ba và sau đó bỏ chặn các tín hiệu sau khi dĩa của bạn/execs. Có lẽ điều đó sẽ cho bạn một số ý tưởng về những gì chính xác xảy ra.

Sử dụng sigprocmask sẽ giúp bạn.

1
  1. Trong cửa sổ cấu hình debug -> Debugger -> Kiểm tra "các quá trình tự động gỡ lỗi chia hai"
  2. mở cửa sổ breakpoint -> menu View -> Thêm sự kiện Breakpoint C/C++ -> "ngã ba gọi là"
  3. Bây giờ khi breakpoint sự kiện xảy ra, nhấn F6 -> bạn sẽ thấy quá trình mới trong cửa sổ gỡ lỗi
  4. Chọn quy trình mới và nhấn F6 - bạn đang ở trẻ em
  5. Thưởng thức
+0

cảm ơn! lưu ý rằng giao diện người dùng khá tệ vì vậy bạn có thể không thấy các hộp kiểm. Chỉ cần nhấp vào văn bản để bật gỡ rối các quy trình được chia nhỏ. – protoss1210

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