2011-09-02 40 views
13

Tôi đang làm việc trên một ứng dụng Linux kết hợp ptrace để quan sát các chủ đề của một quá trình khác. Khi ứng dụng tôi quan sát dĩa một quá trình con này đã hoạt động khá tốt. Bằng cách gọi waitpid trong ứng dụng của tôi, tôi có thể nhận được các tín hiệu sau trong ứng dụng quan sát:ptrace và chủ đề

  • SIGSTOP hình thức quá trình con
  • SIGTRAP từ cha mẹ

Để theo dõi tất cả những đứa trẻ tôi thiết lập ptrace với PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONEPTRACE_O_TRACEEXIT.

Trong khi mọi thứ đang hoạt động khá tốt với các quy trình con, tôi không thể quan sát các chủ đề của ứng dụng. Tôi nhận được SIGTRAP từ quá trình tạo chuỗi nhưng tôi không nhận được bất kỳ tín hiệu nào từ chuỗi.

Có điều gì đặc biệt với chủ đề và ptrace không? Làm thế nào để strace theo dõi các chủ đề (Tôi không thể tìm thấy bất kỳ thói quen đặc biệt dành riêng cho các chủ đề trong mã số strace)?

Đây là cách tôi sử dụng ptrace trong ứng dụng của tôi:

  • Trước tiên tôi gắn với một quá trình: ptrace(PTRACE_ATTACH, pid, NULL, NULL);
  • Sau đó, tôi gọi waitpid(): trace_pid = waitpid(-1, &status, 0);
  • Đặt ptrace lựa chọn: ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

Sau khi đính kèm, tôi gọi số waitpid() trong vòng lặp và gọi ptrace(PTRACE_SETOPTIONS... cho mỗi tác vụ mới được báo cáo bởi ptrace. Tất nhiên, tôi tiếp tục các nhiệm vụ với SIGCONT sau khi xử lý sự kiện.

+1

Tôi nghĩ rằng tôi đã đi được một chút gần gũi hơn với các cốt lõi của vấn đề: Khi một luồng mới được tạo, tôi thậm chí không nhận được sigstop trong quá trình quan sát. Tuy nhiên, trong tài liệu ptrace nó sais: "tự động bắt đầu truy tìm quá trình nhân bản mới, sẽ bắt đầu bằng SIGSTOP." Làm thế nào điều này có thể xảy ra? – mupro

+0

Tôi đã thực hiện một số điều tra sâu hơn bằng cách sử dụng procfs và một ứng dụng nhỏ sử dụng các chủ đề posix. Tất cả các ứng dụng làm là để bắt đầu một chủ đề mới và ngủ trong một thời gian. Chủ đề mới cũng đang ngủ trong vài giây. Như tôi đã nói, tôi không nhận được một sigstop với waitpid cho các chủ đề mới. Tuy nhiên các tập tin trạng thái trong procfs cho thread mới là nói cho tôi: Tên: thread_test Nhà nước: t (tracing ngừng) Tgid: 2538 Pid: 2545 PPID: 2395 TracerPid: 2540 Vì vậy, các chủ đề mới dừng nhưng waitpid không nhận tín hiệu dừng. Cách chính xác của truy tìm chủ đề là gì? – mupro

Trả lời

13

Cuối cùng, tôi đã tìm thấy các giải pháp bản thân mình: Tôi đã nhận các tín hiệu từ tất cả các chủ đề bằng cách gọi

waitpid(-1, &status, __WALL) 

thay vì

waitpid(-1, &status, 0)