Strace / ptrace có thể khiến chương trình bị sập không?


7

Vì vậy, gần đây, tôi đã thảo luận về bước đi với ai đó và họ đang hỏi chuyện gì sẽ xảy ra nếu bạn thực hiện một quy trình đang chạy giống như nó đang tạo ra một ổ cắm mạng hoặc một cái gì đó tương tự. Điều này có thể khiến chương trình bị sập theo những cách không mong muốn?

Từ những gì tôi đã đọc về ptrace, tòa nhà chọc trời được sử dụng bởi strace, nó không thể gây ra bất cứ điều gì như thế nếu bạn chỉ gỡ lỗi một chủ đề. Quá trình được dừng lại, mỗi khi một tòa nhà được gọi, nhưng sau đó nó sẽ tiếp tục và không ai là người khôn ngoan hơn. Tín hiệu được xếp hàng trong khi nó không chạy, vì vậy tôi cho rằng điều gì đó tương tự xảy ra với các tòa nhà / ổ cắm / nghe.

Ptrace có thể được sử dụng trong bối cảnh của strace có thể gây ra bất kỳ sự cố kỳ lạ nào không?


Có một thời gian với các hạt nhân cổ đại có lỗi, trong đó tách ra khỏi một quá trình làm cho nó "biến mất" (nhận SIGKILL). Điều này không còn xảy ra nữa trong nhiều năm nay, nhưng có lẽ bạn đã đọc về một số huyền thoại vẫn còn tồn tại. Lưu ý rằng với ptrace, bạn có khả năng ghi vào bộ nhớ tiến trình, nhưng strace không sử dụng bất kỳ lệnh gọi ptrace nào cho việc đó.
PlasmaHH

Câu trả lời:


10

Không , stracekhông nên gây ra sự cố chương trình -

Ngoại trừ trong trường hợp hơi bất thường này:

Nếu nó có một lỗi phụ thuộc vào thời gian thực hiện hoặc vị trí bộ nhớ thời gian chạy .

Nó có thể kích hoạt loại " heurrorms " này - nhưng cực kỳ hiếm, bởi vì loại lỗi này rất hiếm, và nó chỉ cần kích hoạt theo strace hoặc các thiết bị khác. Và khi bạn tìm thấy một con bọ hung, đó thường là một điều tốt.

Về ptrace()- tòa nhà - đó chỉ là những gì stracebên trong tôi nghĩ, vì vậy nó tương tự. Người ta chỉ có thể làm nhiều hơn stracecó thể khi sử dụng ptrace()trực tiếp.


Ví dụ của bạn sẽ chỉ là loại lỗi này:

Trong ví dụ này, stracesẽ thay đổi thời gian của các bước để tạo kết nối mạng. Nếu điều đó gây ra sự cố, thì đó là "sự cố đang chờ xảy ra" - thời gian thực hiện thay đổi liên tục. Với strace, chỉ một chút nữa thôi. Nhưng bất kỳ ứng dụng nào khác có thể đã thay đổi thời gian nhiều hơn, như bắt đầu một chương trình.


+1 Để làm rõ các ổ cắm WRT, đây sẽ không phải là cơ sở thực sự của một kết nối sẽ gây ra lỗi như vậy. Tôi thực sự không thể tưởng tượng bất cứ ai viết mã mạng có mục đích chung là thời điểm quan trọng theo nghĩa này, mặc dù điều đó rõ ràng là có thể. Tôi tò mò về ý của bạn về sự phức tạp của "vị trí bộ nhớ thời gian chạy".
goldilocks

Ồ, đúng, mã mạng sẽ là từ các lib được thử nghiệm tốt. Về bộ nhớ, tôi "chỉ giả định" rằng thiết bị có bước đi bằng cách nào đó thay đổi việc sử dụng bộ nhớ hoặc quá trình, sao cho con trỏ null chỉ ra ở nơi khác bây giờ. Hmmm ... nếu stracethiết bị xảy ra hoàn toàn bên ngoài quy trình truy tìm, điều đó có thể sai. ('ltrace' nên được xử lý, thay đổi địa chỉ cuộc gọi thư viện)
Volker Siegel

1
Chính xác là thông tin tôi đang tìm kiếm, cảm ơn! Vì vậy, về cơ bản, trong một ứng dụng được viết tốt, strace / ptrace không nên gây ra vấn đề. Các vấn đề phát sinh trong khi sử dụng strace / ptrace cũng có thể được kích hoạt bởi những thứ khác (chẳng hạn như máy tính chậm hơn). Tôi không nghĩ ptrace sửa đổi vị trí bộ nhớ, nhưng tôi sẽ phải kiểm tra.
Brandon Wamboldt

........... Chính xác!
Volker Siegel

stracechỉ sử dụng các tính năng nghe lén của ptrace. ptracecũng có thể sửa đổi việc thực hiện chương trình và nếu bạn làm điều đó, rất dễ khiến chương trình bị sập.
Gilles 'SO- ngừng trở thành ác quỷ'

3

Điều gì sẽ xảy ra nếu bạn thực hiện một quy trình đang chạy giống như nó đang tạo ra một ổ cắm mạng hoặc một cái gì đó tương tự.

Những thứ như thế được thực hiện thông qua các cuộc gọi hệ thống , nghĩa là quá trình đưa ra yêu cầu của kernel và kernel đáp ứng nó. Hạt nhân cũng làm phép thuật để làm ptrace()việc. Mặc dù điều này không có nghĩa là nó không thể tự khắc phục được (đó là một lỗi), nhưng có vẻ như không thể vì đây rõ ràng là một trong những mục đích của nó: phối hợp các quy trình trên một hệ thống đa nhiệm.


1

Tôi thấy rằng các quy trình GUI phân tầng thường dẫn đến sự cố, ngay cả trên HĐH gần đây (ít nhất là OpenSuse 12.3, tôi đã không thử cụ thể vào ngày 13.1 vì tôi đã từ bỏ khá nhiều các quy trình GUI phân tầng).

Tôi không thể nhớ lại việc nhìn thấy tiến trình của một quy trình không phải GUI dẫn đến sự cố trên bất kỳ HĐH nào gần đây.


Tôi có thể thấy cách truy tìm chương trình GUI từ thiết bị đầu cuối chạy trong cùng GUI (cùng màn hình X11) có thể gây ra bế tắc của một loại nào đó, nhưng truy tìm chương trình GUI từ nơi khác hoặc truy tìm nó bằng đầu ra theo dõi được chuyển hướng đến một tệp nên Không thể gây ra điều đó.
Celada

Các chương trình GUI thường có rất nhiều điều kiện chủng tộc trong đó do mã hóa cẩu thả. Điều này gây ra sự cố. Ví dụ, chương trình có thể đang gửi một số lệnh tới X và hy vọng tất cả chúng sẽ được hoàn thành trong một trình xử lý tín hiệu hoặc luồng khác. Họ nhận lại một giá trị bất ngờ và không biết phải làm gì.
Zan Lynx

2
Đối với bản ghi, tôi có cùng một vấn đề với một số chương trình GUI và tôi đã truy tìm thư viện CUDA độc quyền của NVidia chấm dứt quá trình nếu trình nvidia-modprobetrợ giúp (SUID) của nó không thành công. Vì straceptraces nó, suid của nó không hoạt động nên nó thất bại và thư viện CUDA chấm dứt chương trình.
Score_Under

0

Đúng. Điều đó hiếm, và tôi không biết tại sao, nhưng nó chắc chắn xảy ra. Gần đây, điều này đã xảy ra với tôi khi truy tìm lệnh "hoán đổi" kéo dài và không có quyền truy cập mạng cũng như bất kỳ thứ gì khác trông giống như nó sẽ / sẽ gây ra sự cố. Tuy nhiên, ngay sau khi strace được đính kèm, quá trình đã thoát.

>strace -p 73358
strace: Process 73358 attached
getuid()                                = 0
geteuid()                               = 0
getgid()                                = 0
getegid()                               = 0
prctl(PR_GET_DUMPABLE)                  = 1
stat("/etc/fstab", {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
open("/etc/fstab", O_RDONLY|O_CLOEXEC)  = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f24e5cd8000
read(3, "\n#\n# /etc/fstab\n# Created by ana"..., 4096) = 2168
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f24e5cd8000, 4096)            = 0
close(1)                                = 0
close(2)                                = 0
exit_group(-1)                          = ?
+++ exited with 255 +++

Có vẻ như quá trình đã quyết định tự nguyện thoát ra, nhưng xem xét rằng nó đã chạy trong vài giờ trước khi bước đi được bắt đầu, tôi nghi ngờ rằng lối thoát này là trùng hợp.

Vì vậy, vâng, đôi khi strace có thể khiến quá trình hủy bỏ, nhưng hiếm khi những lợi ích của việc có được thông tin tốt có thể vượt xa nguy cơ đó.

Một tùy chọn khác trên linux sẽ là kiểm tra /proc/<PID>/stackxem quy trình hiện đang bị chặn ở đâu. Điều này là an toàn hơn, nhưng cung cấp thông tin ít năng động hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.