Đây là lệnh perldebug có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình giả lập trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
perldebug - gỡ lỗi Perl
MÔ TẢ
Trước hết, bạn đã thử sử dụng -w công tắc?
Nếu bạn chưa quen với trình gỡ lỗi Perl, bạn có thể thích đọc perldebtut, đây là một hướng dẫn
giới thiệu về trình gỡ lỗi.
Perl Debugger
Nếu bạn gọi Perl với -d chuyển đổi, tập lệnh của bạn chạy trong trình gỡ lỗi nguồn Perl.
Điều này hoạt động giống như một môi trường Perl tương tác, nhắc nhở các lệnh trình gỡ lỗi cho phép
bạn kiểm tra mã nguồn, đặt các điểm ngắt, lấy dấu lùi ngăn xếp, thay đổi giá trị của
các biến, v.v. Điều này rất tiện lợi nên bạn thường tự kích hoạt trình gỡ lỗi
chỉ để kiểm tra các cấu trúc Perl một cách tương tác để xem chúng làm gì. Ví dụ:
$ perl -d -e 42
Trong Perl, trình gỡ lỗi không phải là một chương trình riêng biệt như cách nó thường có trong
môi trường biên dịch. Thay vào đó, -d cờ yêu cầu trình biên dịch chèn nguồn
thông tin vào cây phân tích cú pháp mà nó sắp được chuyển cho trình thông dịch. Điều đó có nghĩa là
mã của bạn trước tiên phải biên dịch chính xác để trình gỡ lỗi hoạt động trên đó. Sau đó, khi
trình thông dịch khởi động, nó tải trước một tệp thư viện Perl đặc biệt có chứa trình gỡ lỗi.
Chương trình sẽ tạm dừng ngay trước câu lệnh thực thi thời gian chạy đầu tiên (nhưng hãy xem bên dưới
liên quan đến các câu lệnh thời gian biên dịch) và yêu cầu bạn nhập lệnh trình gỡ lỗi. Trái với
kỳ vọng phổ biến, bất cứ khi nào trình gỡ lỗi tạm dừng và hiển thị cho bạn một dòng mã, nó luôn
hiển thị dòng nó về để thực thi, thay vì một lệnh mà nó vừa thực thi.
Bất kỳ lệnh nào không được trình gỡ lỗi nhận dạng đều được thực thi trực tiếp ("eval" 'd) dưới dạng mã Perl trong
gói hiện tại. (Trình gỡ lỗi sử dụng gói DB để giữ trạng thái của chính nó
thông tin.)
Lưu ý rằng "eval" đã nói bị ràng buộc bởi một phạm vi ngầm định. Kết quả là bất kỳ mới nào được giới thiệu
biến từ vựng hoặc bất kỳ nội dung bộ đệm chụp đã sửa đổi nào sẽ bị mất sau khi đánh giá. Các
trình gỡ lỗi là một môi trường tốt để học Perl, nhưng nếu bạn thử nghiệm tương tác bằng cách sử dụng
tài liệu nào phải trong cùng một phạm vi, hãy xếp nó vào một dòng.
Đối với bất kỳ văn bản nào được nhập tại lời nhắc của trình gỡ lỗi, khoảng trắng đầu và cuối là khoảng trắng đầu tiên
tước trước khi xử lý tiếp theo. Nếu một lệnh của trình gỡ lỗi trùng với một số chức năng trong
chương trình của riêng bạn, chỉ đơn thuần đặt trước hàm bằng một cái gì đó không giống như
lệnh gỡ lỗi, chẳng hạn như dấu ";" hoặc có thể là "+", hoặc bằng cách gói nó bằng
dấu ngoặc đơn hoặc dấu ngoặc nhọn.
đang gọi các Debugger
Có một số cách để gọi trình gỡ lỗi:
Perl -d program_name
Trên chương trình đã cho được xác định bởi "tên_chương_trình".
Perl -d -e 0
Cung cấp một cách tương tác một "biểu thức" tùy ý bằng cách sử dụng "-e".
perl -d: ptkdb program_name
Gỡ lỗi một chương trình nhất định thông qua GUI "Devel :: ptkdb".
perl -dt threaded_program_name
Gỡ lỗi một chương trình nhất định bằng cách sử dụng các chuỗi (thử nghiệm).
Debugger Lệnh
Trình gỡ lỗi tương tác hiểu các lệnh sau:
h In ra một thông báo trợ giúp tóm tắt
h [command] In ra thông báo trợ giúp cho lệnh trình gỡ lỗi đã cho.
hh Đối số đặc biệt của "hh" tạo ra toàn bộ trang trợ giúp, khá
Dài.
Nếu đầu ra của lệnh "hh" (hoặc bất kỳ lệnh nào, cho vấn đề đó) cuộn
qua màn hình của bạn, đặt trước lệnh bằng biểu tượng dấu gạch đứng đầu để nó
chạy qua máy nhắn tin của bạn, như trong
DB> | hh
Bạn có thể thay đổi máy nhắn tin được sử dụng thông qua lệnh "o pager = ...".
p expr Tương tự như "print {$ DB :: OUT} expr" trong gói hiện tại. Đặc biệt,
bởi vì đây chỉ là hàm "in" của riêng Perl, điều này có nghĩa là dữ liệu lồng nhau
cấu trúc và đối tượng không bị đổ, không giống như lệnh "x".
Xử lý tệp "DB :: OUT" được mở để / dev / tty, bất kể nơi STDOUT có thể
được chuyển hướng đến.
x [độ sâu tối đa] expr
Đánh giá biểu hiện của nó trong ngữ cảnh danh sách và đưa ra kết quả trong một kết quả khá-
thời trang in. Các cấu trúc dữ liệu lồng nhau được in ra một cách đệ quy, không giống như
hàm "in" thực trong Perl. Khi kết xuất hàm băm, có thể bạn sẽ
thích 'x \% h' hơn là 'x% h'. Xem Dumpvalue nếu bạn muốn làm điều này
bản thân bạn.
Định dạng đầu ra được điều chỉnh bởi nhiều tùy chọn được mô tả trong
"Tùy chọn có thể cấu hình".
Nếu "maxdepth" được bao gồm, nó phải là một chữ số N; giá trị bị bán phá giá
có thể N mức sâu, như thể tùy chọn "dumpDepth" tạm thời được đặt thành
N.
V [pkg [vars]]
Hiển thị tất cả (hoặc một số) biến trong gói (mặc định là "chính") bằng cách sử dụng dữ liệu
máy in đẹp (hàm băm hiển thị các khóa và giá trị của chúng để bạn thấy những gì,
các ký tự điều khiển có thể in được, v.v.). Hãy chắc chắn rằng bạn không đặt
nhập chỉ định (như "$") vào đó, chỉ tên ký hiệu, như thế này:
Dòng tên tệp V DB
Sử dụng "~ mẫu" và "! Mẫu" cho các biểu tượng dương và âm.
Điều này tương tự như việc gọi lệnh "x" trên mỗi var có thể áp dụng.
X [vars] Tương tự như "V currentpackage [vars]".
y [cấp [vars]]
Hiển thị tất cả (hoặc một số) biến từ vựng (biến nhớ: "mY") trong
phạm vi hiện tại hoặc cấp phạm vi cao hơn. Bạn có thể giới hạn các biến mà bạn
xem với đi hoạt động chính xác như nó hoạt động đối với lệnh "V" và "X".
Yêu cầu mô-đun "PadWalker" phiên bản 0.08 trở lên; sẽ cảnh báo nếu điều này
chưa được cài đặt. Đầu ra được in đẹp theo cùng một kiểu như đối với "V" và
định dạng được kiểm soát bởi các tùy chọn giống nhau.
T Sản xuất backtrace ngăn xếp. Xem bên dưới để biết chi tiết về đầu ra của nó.
s [expr] Một bước. Thực thi cho đến khi bắt đầu một câu lệnh khác, giảm dần
vào các lệnh gọi chương trình con. Nếu một biểu thức được cung cấp bao gồm hàm
cuộc gọi, nó cũng sẽ là một bước.
n [expr] Tiếp theo. Thực thi các lệnh gọi chương trình con, cho đến đầu lệnh tiếp theo
tuyên bố. Nếu một biểu thức được cung cấp bao gồm các lệnh gọi hàm, những
các hàm sẽ được thực hiện với các điểm dừng trước mỗi câu lệnh.
Tiếp tục cho đến khi trả về từ chương trình con hiện tại. Bán phá giá giá trị trả về
nếu tùy chọn "PrintRet" được đặt (mặc định).
Lặp lại lệnh "n" hoặc "s" cuối cùng.
c [dòng | phụ]
Tiếp tục, tùy chọn chèn điểm ngắt chỉ dùng một lần tại điểm đã chỉ định
dòng hoặc chương trình con.
l Liệt kê các dòng tiếp theo của cửa sổ.
l min + incr Danh sách các dòng "incr + 1" bắt đầu từ "min".
l min-max Danh sách các dòng từ "min" đến "max". "l -" đồng nghĩa với "-".
l line Liệt kê một dòng duy nhất.
l tên con Liệt kê cửa sổ đầu tiên của các dòng từ chương trình con. tên phụ có thể là một biến mà
chứa một tham chiếu mã.
- Liệt kê các dòng cửa sổ trước đó.
v [line] Xem một vài dòng mã xung quanh dòng hiện tại.
. Trả con trỏ trình gỡ lỗi nội bộ về dòng được thực thi lần cuối và in ra
dòng đó.
f filename Chuyển sang xem một tệp khác hoặc câu lệnh "eval". Nếu như tên tập tin không phải là một
tên đường dẫn đầy đủ được tìm thấy trong các giá trị của% INC, nó được coi là regex.
chuỗi "eval" ed (khi có thể truy cập được) được coi là tên tệp: "f (eval
7) "và" f eval 7 \ b "truy cập vào nội dung của chuỗi ed" eval "thứ 7 (theo thứ tự
thực hiện). Phần thân của "eval" hiện được thực thi và của "eval" ed
các chuỗi xác định các chương trình con được lưu và do đó có thể truy cập được.
/ pattern / Tìm kiếm chuyển tiếp cho mẫu (một Perl regex); cuối cùng / là tùy chọn. Tìm kiếm
là không phân biệt chữ hoa chữ thường theo mặc định.
?mẫu? Tìm kiếm ngược cho mẫu; cuối cùng ? Là tùy chọn. Tìm kiếm là trường hợp-
không nhạy cảm theo mặc định.
L [abw] Liệt kê (mặc định tất cả) hành động, điểm ngắt và biểu thức xem
S [[!] Regex]
Liệt kê các tên chương trình con [không] khớp với regex.
t [n] Chuyển đổi chế độ theo dõi (xem thêm tùy chọn "AutoTrace"). Đối số tùy chọn là
số mức tối đa để theo dõi bên dưới mức hiện tại; bất cứ điều gì sâu sắc hơn
điều đó sẽ im lặng.
t [n] expr Theo dõi thông qua việc thực thi "expr". Đối số đầu tiên tùy chọn là giá trị tối đa
số cấp độ cần theo dõi bên dưới cấp độ hiện tại; bất cứ điều gì sâu sắc hơn thế
sẽ im lặng. Xem "Ví dụ đầu ra danh sách khung" trong perldebguts cho
ví dụ.
b Đặt điểm ngắt trên dòng hiện tại
b [dòng] [điều kiện]
Đặt điểm ngắt trước dòng đã cho. Nếu một điều kiện được chỉ định, nó
được đánh giá mỗi khi đạt được câu lệnh: một điểm ngắt chỉ được thực hiện nếu
điều kiện là đúng. Các điểm ngắt chỉ có thể được đặt trên các dòng bắt đầu
câu lệnh thực thi. Điều kiện không sử dụng "nếu":
b 237 $ x> 30
b 237 ++ $ count237 <11
b 33 / mẫu / i
Nếu số dòng là ".", Hãy đặt điểm ngắt trên dòng hiện tại:
NS . $ n> 100
b [tệp]: [dòng] [tình trạng]
Đặt một điểm ngắt trước dòng đã cho trong một tệp (có thể khác). Nếu một
điều kiện được chỉ định, nó được đánh giá mỗi khi đạt được câu lệnh: a
breakpoint chỉ được thực hiện nếu điều kiện là đúng. Điểm ngắt chỉ có thể là
đặt trên các dòng bắt đầu một câu lệnh thực thi. Điều kiện không sử dụng "nếu":
b lib / MyModule.pm: 237 $ x> 30
b /usr/lib/perl5/site_perl/CGI.pm:100 ++ $ count100 <11
b tên phụ [điều kiện]
Đặt một điểm ngắt trước dòng đầu tiên của chương trình con được đặt tên. tên phụ có thể
là một biến chứa tham chiếu mã (trong trường hợp này điều kiện không phải là
được hỗ trợ).
b hoãn tên phụ [điều kiện]
Đặt một điểm ngắt ở dòng đầu tiên của chương trình con sau khi nó được biên dịch.
b tải tên tệp
Đặt một điểm ngắt trước dòng được thực thi đầu tiên của tên tập tin, nên
là một tên đường dẫn đầy đủ được tìm thấy trong số các giá trị% INC.
b biên dịch tên con
Đặt một điểm ngắt trước khi câu lệnh đầu tiên được thực thi sau khi được chỉ định
chương trình con được biên dịch.
Dòng B Xóa một điểm ngắt khỏi điểm đã chỉ định hàng.
B * Xóa tất cả các điểm ngắt đã cài đặt.
vô hiệu hóa [tệp]: [dòng]
Vô hiệu hóa điểm ngắt để nó không dừng việc thực thi chương trình.
Các điểm ngắt được bật theo mặc định và có thể được bật lại bằng cách sử dụng "bật"
chỉ huy.
vô hiệu hóa [dòng]
Vô hiệu hóa điểm ngắt để nó không dừng việc thực thi chương trình.
Các điểm ngắt được bật theo mặc định và có thể được bật lại bằng cách sử dụng "bật"
chỉ huy.
Điều này được thực hiện cho một điểm ngắt trong tệp hiện tại.
bật [tệp]: [dòng]
Kích hoạt điểm ngắt để nó sẽ dừng việc thực thi chương trình.
bật [dòng]
Kích hoạt điểm ngắt để nó sẽ dừng việc thực thi chương trình.
Điều này được thực hiện cho một điểm ngắt trong tệp hiện tại.
một lệnh [dòng]
Đặt một hành động sẽ được thực hiện trước khi dòng được thực thi. Nếu như hàng được bỏ qua, thiết lập
một hành động trên dòng sắp được thực hiện. Trình tự các bước được thực hiện bởi
trình gỡ lỗi là
1. kiểm tra điểm ngắt ở dòng này
2. in dòng nếu cần (truy tìm)
3. thực hiện bất kỳ hành động nào liên quan đến dòng đó
4. nhắc người dùng nếu ở một điểm ngắt hoặc trong một bước
5. đánh giá dòng
Ví dụ: điều này sẽ in ra $ foo mỗi khi dòng 53 được chuyển qua:
một bản in 53 "DB FOUND $ foo \ n"
Một dòng Xóa một hành động khỏi dòng được chỉ định.
A * Xóa tất cả các hành động đã cài đặt.
w expr Thêm một biểu thức theo dõi toàn cục. Bất cứ khi nào một toàn cầu đã xem thay đổi trình gỡ lỗi
sẽ dừng và hiển thị các giá trị cũ và mới.
W expr Xóa biểu thức xem
W * Xóa tất cả các biểu thức đồng hồ.
o Hiển thị tất cả các tùy chọn.
o booption ...
Đặt mỗi tùy chọn Boolean được liệt kê thành giá trị 1.
o tùy chọn nào? ...
In ra giá trị của một hoặc nhiều tùy chọn.
o option = giá trị ...
Đặt giá trị của một hoặc nhiều tùy chọn. Nếu giá trị có khoảng trắng bên trong,
nó nên được trích dẫn. Ví dụ: bạn có thể đặt "o pager =" less -MQeicsNfr ""
để gọi ít với các tùy chọn cụ thể đó. Bạn có thể sử dụng đơn hoặc đôi
nhưng nếu bạn làm vậy, bạn phải thoát khỏi bất kỳ phiên bản nhúng nào có cùng loại
trích dẫn mà bạn đã bắt đầu, cũng như bất kỳ hành vi trốn thoát nào ngay lập tức
đặt trước câu trích dẫn đó nhưng không có nghĩa là thoát khỏi câu trích dẫn đó. Trong
nói cách khác, bạn tuân theo các quy tắc trích dẫn đơn bất kể trích dẫn nào; Cái tôi
option = 'this isn \' t bad '"hoặc" o option = "Cô ấy nói, \" Phải không? \ "" ".
Vì lý do lịch sử, "= value" là tùy chọn, nhưng chỉ mặc định là 1 trong đó
nó là an toàn để làm như vậy - đó là, hầu hết cho các tùy chọn Boolean. Nó luôn luôn tốt hơn
để gán một giá trị cụ thể bằng cách sử dụng "=". "Tùy chọn" có thể được viết tắt, nhưng
để rõ ràng có lẽ không nên. Một số tùy chọn có thể được thiết lập cùng nhau. Nhìn thấy
"Tùy chọn có thể cấu hình" cho một danh sách trong số này.
<? Liệt kê tất cả các hành động lệnh Perl trước khi nhắc.
<[lệnh]
Đặt một hành động (lệnh Perl) xảy ra trước mỗi lời nhắc của trình gỡ lỗi. Một đa
dòng lệnh có thể được nhập bằng cách gạch chéo ngược các dòng mới.
<* Xóa tất cả các hành động lệnh Perl nhắc trước.
Lệnh << Thêm một hành động (lệnh Perl) xảy ra trước mọi lời nhắc của trình gỡ lỗi. Một đa
lệnh dòng có thể được nhập bằng cách đánh dấu lùi các dòng mới.
>? Liệt kê các hành động lệnh Perl sau lời nhắc.
> lệnh Đặt một hành động (lệnh Perl) để xảy ra sau lời nhắc khi bạn vừa đưa ra
một lệnh để quay lại thực thi tập lệnh. Một lệnh nhiều dòng có thể là
được nhập bằng cách gạch chéo ngược các dòng mới (chúng tôi cá rằng bạn không thể đoán được điều này bởi
hiện nay).
> * Xóa tất cả các hành động lệnh Perl sau lời nhắc.
>> lệnh Thêm một hành động (lệnh Perl) xảy ra sau lời nhắc khi bạn vừa
đưa ra một lệnh để quay lại thực thi tập lệnh. Một lệnh nhiều dòng có thể
được nhập bằng cách gạch chéo ngược các dòng mới.
{? Liệt kê các lệnh gỡ lỗi trước lời nhắc.
{ [ chỉ huy ]
Đặt một hành động (lệnh trình gỡ lỗi) xảy ra trước mỗi lời nhắc của trình gỡ lỗi. MỘT
lệnh nhiều dòng có thể được nhập theo cách thông thường.
Bởi vì lệnh này theo một số nghĩa là mới, một cảnh báo sẽ được đưa ra nếu bạn xuất hiện
thay vào đó đã vô tình nhập vào một khối. Nếu đó là điều bạn muốn làm,
viết nó như với "; {...}" hoặc thậm chí là "do {...}".
{* Xóa tất cả các lệnh của trình gỡ lỗi nhắc trước.
{{command Thêm một hành động (lệnh gỡ lỗi) xảy ra trước mỗi lời nhắc của trình gỡ lỗi. MỘT
Có thể nhập lệnh nhiều dòng, nếu bạn có thể đoán cách: xem ở trên.
! số Làm lại một lệnh trước đó (mặc định là lệnh trước đó).
! -number Làm lại số lệnh trước đó.
! mẫu Làm lại lệnh cuối cùng bắt đầu với mẫu. Cũng xem "o summonCommand".
!! cmd Chạy cmd trong một quy trình con (đọc từ DB :: IN, ghi vào DB :: OUT) Xem "o
shellBang ", nữa. Lưu ý rằng shell hiện tại của người dùng (à, $ ENV {SHELL} của họ
biến) sẽ được sử dụng, điều này có thể cản trở việc giải thích đúng về lối thoát
trạng thái hoặc tín hiệu và thông tin coredump.
tệp nguồn Đọc và thực thi các lệnh trình gỡ lỗi từ hồ sơ. hồ sơ bản thân nó có thể chứa
lệnh "nguồn".
H -number Hiển thị n lệnh cuối cùng. Chỉ các lệnh dài hơn một ký tự mới được liệt kê.
If con số được bỏ qua, liệt kê tất cả.
q hoặc ^ D Thoát. ("Thoát" không hoạt động cho điều này, trừ khi bạn đã đặt bí danh) Đây là
cách duy nhất được hỗ trợ để thoát khỏi trình gỡ lỗi, mặc dù gõ "exit" hai lần có thể
làm việc.
Đặt tùy chọn "ức chế_xã hội" thành 0 nếu bạn muốn có thể đi đến cuối
kịch bản. Bạn cũng có thể cần đặt $ finish thành 0 nếu bạn muốn bước
thông qua sự tàn phá toàn cầu.
R Khởi động lại trình gỡ lỗi bằng cách "thi hành ()" trong một phiên mới. Chúng tôi cố gắng duy trì
lịch sử trên này, nhưng cài đặt nội bộ và các tùy chọn dòng lệnh có thể
mất đi.
Cài đặt sau hiện được giữ nguyên: lịch sử, điểm ngắt, hành động,
tùy chọn trình gỡ lỗi và tùy chọn dòng lệnh Perl -w, -Ivà -e.
| dbcmd Chạy lệnh trình gỡ lỗi, đưa DB :: OUT vào máy nhắn tin hiện tại của bạn.
|| dbcmd Tương tự như "| dbcmd" nhưng DB :: OUT cũng tạm thời là "select" ed.
= [giá trị bí danh]
Xác định bí danh lệnh, như
= bỏ q
hoặc liệt kê các bí danh hiện tại.
lệnh Thực hiện lệnh dưới dạng câu lệnh Perl. Dấu chấm phẩy ở cuối sẽ được cung cấp.
Nếu câu lệnh Perl khác sẽ bị nhầm lẫn với trình gỡ lỗi Perl, hãy sử dụng
dấu chấm phẩy đứng đầu cũng vậy.
m expr Liệt kê các phương thức có thể được gọi trên kết quả của biểu thức được đánh giá.
Biểu thức có thể được đánh giá thành một tham chiếu đến một đối tượng được ban phước hoặc đến một
tên gói hàng.
M Hiển thị tất cả các mô-đun đã tải và phiên bản của chúng.
người đàn ông [manpage]
Mặc dù tên của nó, điều này gọi trình xem tài liệu mặc định của hệ thống của bạn trên
trang nhất định hoặc trên chính người xem nếu trang chủ được bỏ qua. Nếu người xem đó là
người đàn ông, thông tin "Cấu hình" hiện tại được sử dụng để gọi người đàn ông sử dụng thích hợp
MANPATH hoặc -M con đường đàn ông Lựa chọn. Không tra cứu được biểu mẫu "XXX" phù hợp
các trang đã biết của biểu mẫu perlXXX sẽ được thử lại. Điều này cho phép bạn nhập "man
gỡ lỗi "hoặc" man op "từ trình gỡ lỗi.
Trên các hệ thống truyền thống không sử dụng được người đàn ông lệnh, trình gỡ lỗi gọi
perldoc. Đôi khi xác định này không chính xác do tính ngoan cố
nhà cung cấp hay nói đúng hơn là những người dùng dám nghĩ dám làm. Nếu bạn rơi vào
một trong hai danh mục, chỉ cần đặt biến $ DB :: doccmd theo cách thủ công thành bất kỳ trình xem nào
để xem tài liệu Perl trên hệ thống của bạn. Điều này có thể được đặt trong tệp rc,
hoặc thông qua phân công trực tiếp. Chúng tôi vẫn đang chờ đợi một ví dụ hoạt động của
một cái gì đó dọc theo dòng của:
$ DB :: doccmd = 'netscape -remote http://something.here/';
Cấu hình Các lựa chọn
Trình gỡ lỗi có nhiều tùy chọn có thể thiết lập bằng lệnh "o", tương tác hoặc
từ môi trường hoặc tệp rc. (./.perldb hoặc ~ / .perldb dưới Unix.)
"summonCommand", "ShellBang"
Các ký tự được sử dụng để gọi lại một lệnh hoặc sinh ra một trình bao. Theo mặc định, cả hai
được đặt thành "!", điều này thật đáng tiếc.
Chương trình "pager" để sử dụng cho đầu ra của các lệnh được phân chia bằng máy nhắn tin (những lệnh bắt đầu bằng dấu "|"
ký tự.) Theo mặc định, $ ENV {PAGER} sẽ được sử dụng. Bởi vì trình gỡ lỗi sử dụng
đặc điểm thiết bị đầu cuối hiện tại của bạn để in đậm và gạch chân, nếu được chọn
máy nhắn tin không chuyển các chuỗi thoát qua không thay đổi, đầu ra của một số
lệnh gỡ lỗi sẽ không thể đọc được khi được gửi qua máy nhắn tin.
"tkRunning" Chạy Tk trong khi nhắc (với ReadLine).
"signalLevel", "warningLevel", "dieLevel"
Mức độ chi tiết. Theo mặc định, trình gỡ lỗi để lại các ngoại lệ của bạn và
riêng cảnh báo, bởi vì việc thay đổi chúng có thể phá vỡ các chương trình đang chạy chính xác.
Nó sẽ cố gắng in một thông báo khi các tín hiệu INT, BUS hoặc SEGV không được thông báo
đến. (Nhưng hãy xem đề cập đến các tín hiệu trong "BUGS" bên dưới.)
Để tắt chế độ an toàn mặc định này, hãy đặt các giá trị này cao hơn
0. Ở cấp độ 1, bạn nhận được dấu vết sau khi nhận được bất kỳ loại cảnh báo nào
(điều này thường gây khó chịu) hoặc ngoại lệ (điều này thường có giá trị).
Thật không may, trình gỡ lỗi không thể phân biệt các trường hợp ngoại lệ nghiêm trọng với không gây tử vong
những cái. Nếu "dieLevel" thậm chí là 1, thì các trường hợp ngoại lệ không gây tử vong của bạn cũng được truy tìm
và không bị thay đổi một cách hài hòa nếu chúng đến từ các chuỗi "eval'ed" hoặc từ bất kỳ
loại "eval" trong các mô-đun mà bạn đang cố tải. Nếu "dieLevel" là 2,
trình gỡ lỗi không quan tâm chúng đến từ đâu: Nó chiếm đoạt ngoại lệ của bạn
xử lý và in ra một dấu vết, sau đó sửa đổi tất cả các ngoại lệ với
sự tô điểm. Điều này có thể hữu ích cho một số mục đích theo dõi, nhưng
có xu hướng phá hủy một cách vô vọng bất kỳ chương trình nào có xử lý ngoại lệ của nó
nghiêm túc.
Chế độ theo dõi "AutoTrace" (tương tự như lệnh "t", nhưng có thể được đưa vào "PERLDB_OPTS").
"LineInfo" Tệp hoặc đường dẫn để in thông tin số dòng tới. Nếu đó là một đường ống (giả sử,
"| visual_perl_db"), sau đó một thông báo ngắn được sử dụng. Đây là cơ chế được sử dụng
để tương tác với trình chỉnh sửa nô lệ hoặc trình gỡ lỗi trực quan, chẳng hạn như "vi" đặc biệt
hoặc hook "emacs" hoặc trình gỡ lỗi đồ họa "ddd".
"ức chế_exit"
Nếu 0, cho phép bước off phần cuối của kịch bản.
"PrintRet" In giá trị trả về sau lệnh "r" nếu được đặt (mặc định).
"đồ trang trí" Ảnh hưởng đến sự xuất hiện trên màn hình của dòng lệnh (xem Thuật ngữ :: ReadLine). Có
hiện không có cách nào để vô hiệu hóa những điều này, điều này có thể khiến một số đầu ra không đọc được trên
một số màn hình, hoặc với một số máy nhắn tin. Đây được coi là một lỗi.
"frame" Ảnh hưởng đến việc in thông báo khi vào và ra khỏi các chương trình con. Nếu như
"frame & 2" là sai, thông báo chỉ được in khi nhập. (In khi thoát
có thể hữu ích nếu xen kẽ với các thông báo khác.)
Nếu "frame & 4", các đối số cho các hàm được in, cùng với ngữ cảnh và trình gọi
thông tin. Nếu "frame & 8", "stringify" và "tie" d "FETCH" được bật trên
các đối số được in. Nếu "frame & 16", giá trị trả về từ chương trình con
được in.
Độ dài mà tại đó danh sách đối số bị cắt ngắn được điều chỉnh bởi
tùy chọn:
"maxTraceLen"
Độ dài để cắt ngắn danh sách đối số khi bit 4 của tùy chọn "khung" được đặt.
"windowSize"
Thay đổi kích thước của cửa sổ danh sách mã (mặc định là 10 dòng).
Các tùy chọn sau ảnh hưởng đến những gì xảy ra với các lệnh "V", "X" và "x":
"arrayDepth", "hashDepth"
Chỉ in N phần tử đầu tiên ('' cho tất cả).
"dumpDepth" Giới hạn độ sâu đệ quy ở mức N khi kết xuất cấu trúc. Giá trị âm
được hiểu là vô cùng. Mặc định: vô cực.
"compactDump", "veryCompact"
Thay đổi kiểu của mảng và đầu ra băm. Nếu "compactDump", mảng ngắn có thể
được in trên một dòng.
"GlobPrint" Có in nội dung của các quả địa cầu hay không.
"DumpDBFiles"
Kết xuất mảng chứa các tệp đã gỡ lỗi.
"DumpPackages"
Bảng ký hiệu bán phá giá của các gói.
"DumpReused"
Kết xuất nội dung của các địa chỉ "được sử dụng lại".
"quote", "HighBit", "undefPrint"
Thay đổi kiểu kết xuất chuỗi. Giá trị mặc định cho "quote" là "auto"; một
có thể kích hoạt định dạng kép hoặc một quotish bằng cách đặt nó thành "" "hoặc
"'", tương ứng. Theo mặc định, các ký tự có bộ bit cao của chúng được in
nguyên văn.
"Chỉ sử dụng" Kết xuất sử dụng bộ nhớ thô sơ cho mỗi gói. Tính tổng kích thước của chuỗi
được tìm thấy trong các biến trong gói. Điều này không bao gồm từ vựng trong một
phạm vi tệp của mô-đun hoặc bị mất khi đóng.
"HistFile" Đường dẫn của tệp mà từ đó lịch sử (giả sử một Cụm từ có thể sử dụng :: ReadLine
backend) sẽ được đọc khi khởi động trình gỡ lỗi và nó sẽ được lưu vào đó
khi tắt máy (duy trì liên tục trong các phiên). Tương tự về khái niệm với Bash's
Tệp ".bash_history".
"HistSize" Số dòng đã lưu trong lịch sử (giả sử "HistFile" ở trên).
Sau khi tệp rc được đọc, trình gỡ lỗi đọc biến môi trường $ ENV {PERLDB_OPTS}
và phân tích cú pháp này dưới dạng phần còn lại của dòng "O ..." khi người ta có thể nhập vào trình gỡ lỗi
lời nhắc. Bạn có thể đặt các tùy chọn khởi tạo "TTY", "noTTY", "ReadLine" và
"NonStop" ở đó.
Nếu tệp rc của bạn chứa:
parse_options ("NonStop = 1 LineInfo = db.out AutoTrace");
thì tập lệnh của bạn sẽ chạy mà không có sự can thiệp của con người, đưa thông tin theo dõi vào
hồ sơ db.out. (Nếu bạn làm gián đoạn nó, tốt hơn bạn nên đặt lại "LineInfo" thành / dev / tty nếu bạn
mong đợi để xem bất cứ điều gì.)
"TTY" TTY được sử dụng để gỡ lỗi I / O.
"noTTY" Nếu được đặt, trình gỡ lỗi sẽ chuyển sang chế độ "Không dừng" và sẽ không kết nối với TTY.
Nếu bị gián đoạn (hoặc nếu điều khiển chuyển đến trình gỡ lỗi thông qua cài đặt rõ ràng của
$ DB :: signal hoặc $ DB :: single từ tập lệnh Perl), nó kết nối với TTY
được chỉ định trong tùy chọn "TTY" khi khởi động hoặc đến một tty được tìm thấy trong thời gian chạy bằng cách sử dụng
mô-đun "Kỳ hạn :: Điểm hẹn" mà bạn chọn.
Mô-đun này phải triển khai một phương thức có tên "mới" trả về một đối tượng với
hai phương thức: "IN" và "OUT". Những thứ này sẽ trả về các bộ xử lý tệp để sử dụng cho
gỡ lỗi đầu vào và đầu ra tương ứng. Phương pháp "mới" sẽ kiểm tra
đối số chứa giá trị $ ENV {PERLDB_NOTTY} khi khởi động hoặc
"$ ENV {HOME} /. Perldbtty $$" nếu không. Tệp này không được kiểm tra cho phù hợp
quyền sở hữu, vì vậy về mặt lý thuyết có thể xảy ra các nguy cơ bảo mật.
"ReadLine" Nếu sai, hỗ trợ readline trong trình gỡ lỗi bị tắt để gỡ lỗi
các ứng dụng tự sử dụng ReadLine.
"NonStop" Nếu được đặt, trình gỡ lỗi sẽ chuyển sang chế độ không tương tác cho đến khi bị gián đoạn, hoặc
theo chương trình bằng cách đặt $ DB :: signal hoặc $ DB :: single.
Dưới đây là ví dụ về việc sử dụng biến $ ENV {PERLDB_OPTS}:
$ PERLDB_OPTS = "NonStop frame = 2" perl -d myprogram
Điều đó sẽ chạy tập lệnh chương trình của tôi mà không có sự can thiệp của con người, in ra cây cuộc gọi
với các điểm vào và ra. Lưu ý rằng "NonStop = 1 frame = 2" tương đương với "N f = 2" và
rằng ban đầu, các tùy chọn có thể được viết tắt duy nhất bằng chữ cái đầu tiên (mô đun
Tùy chọn "Bán phá giá *"). Tuy nhiên, chúng tôi khuyên bạn nên luôn viết đầy đủ
để dễ đọc và khả năng tương thích trong tương lai.
Các ví dụ khác bao gồm
$ PERLDB_OPTS = "NonStop LineInfo = list frame = 2" perl -d myprogram
chạy tập lệnh không tương tác, in thông tin về mỗi mục nhập vào chương trình con và
mỗi dòng được thực thi vào tệp có tên niêm yết. (Nếu bạn làm gián đoạn nó, bạn sẽ tốt hơn
đặt lại "LineInfo" thành một thứ gì đó "tương tác"!)
Các ví dụ khác bao gồm (sử dụng cú pháp shell tiêu chuẩn để hiển thị biến môi trường
cài đặt):
$ (PERLDB_OPTS = "NonStop frame = 1 AutoTrace LineInfo = tperl.out"
perl -d myprogram)
có thể hữu ích để gỡ lỗi một chương trình sử dụng chính "Term :: ReadLine". Đừng
quên tách vỏ của bạn khỏi TTY trong cửa sổ tương ứng với / dev / ttyXX,
nói, bằng cách đưa ra một lệnh như
$ giấc ngủ 1000000
Xem "Nội bộ của trình gỡ lỗi" trong perldebguts để biết chi tiết.
Debugger Đầu ra đầu vào
Lời nhắc Lời nhắc của trình gỡ lỗi giống như
DB <8>
hoặc thậm chí
DB <<17>>
trong đó số đó là số lệnh và bạn sẽ sử dụng để truy cập bằng
được xây dựng trong csh-như lịch sử cơ chế. Ví dụ: "! 17" sẽ lặp lại lệnh
số 17. Chiều sâu của dấu ngoặc nhọn cho biết chiều sâu lồng vào của
trình gỡ lỗi. Ví dụ: bạn có thể nhận được nhiều hơn một bộ dấu ngoặc, nếu bạn
đã ở một điểm ngắt và sau đó in kết quả của một lệnh gọi hàm mà chính nó
có một điểm ngắt hoặc bạn bước vào một biểu thức thông qua lệnh "s / n / t biểu thức".
Lệnh nhiều dòng
Nếu bạn muốn nhập một lệnh nhiều dòng, chẳng hạn như định nghĩa chương trình con với
một số câu lệnh hoặc một định dạng, hãy thoát khỏi dòng mới thường kết thúc
lệnh gỡ lỗi có dấu gạch chéo ngược. Đây là một ví dụ:
DB<1> cho (1..4) {
tiếp: print "ok\n";
tiếp:}
ok
ok
ok
ok
Lưu ý rằng nghiệp vụ thoát dòng mới này dành riêng cho các lệnh tương tác
đã nhập vào trình gỡ lỗi.
ngăn xếp lùi
Dưới đây là một ví dụ về giao diện ngăn xếp thông qua lệnh "T" có thể trông như thế nào:
$ = main :: bị nhiễm từ tệp 'Ambulation.pm' dòng 10
@ = Ambulation :: chân (1, 2, 3, 4) được gọi từ tệp 'camel_flea' dòng 7
$ = main :: pest ('bactrian', 4) được gọi từ tệp 'camel_flea' dòng 4
Ký tự bên trái ở đó cho biết bối cảnh mà hàm
được gọi, với "$" và "@" có nghĩa là ngữ cảnh vô hướng hoặc danh sách tương ứng và "."
nghĩa là ngữ cảnh void (thực ra là một loại ngữ cảnh vô hướng). Màn hình hiển thị
ở trên nói rằng bạn đã ở trong hàm "main :: infested" khi bạn chạy ngăn xếp
kết xuất và nó được gọi trong ngữ cảnh vô hướng từ dòng 10 của tệp
Tham vọng.pm, nhưng không có bất kỳ đối số nào, có nghĩa là nó được gọi là
& lây nhiễm. Khung ngăn xếp tiếp theo cho thấy rằng hàm "Ambulation :: chân" là
được gọi trong ngữ cảnh danh sách từ lạc đà_flea tệp có bốn đối số. Cuối cùng
khung ngăn xếp cho thấy rằng "chính :: sinh vật gây hại" được gọi trong ngữ cảnh vô hướng, cũng từ
lạc đà_flea, nhưng từ dòng 4.
Nếu bạn thực hiện lệnh "T" từ bên trong câu lệnh "sử dụng" đang hoạt động,
backtrace sẽ chứa cả khung "request" và "eval".
Định dạng danh sách dòng
Điều này cho thấy các loại đầu ra mà lệnh "l" có thể tạo ra:
DB <<13>> l
Chương 101: @i {@i} = ();
102: b @isa {@ i, $ pack} = ()
103 if (tồn tại $ i {$ prevpack} || tồn tại $ isa {$ pack});
104}
105
106 tiếp theo
107 ==> if (tồn tại $ isa {$ pack});
108
109: a nếu ($ phụ--> 0) {
110:% isa = ($ gói, 1);
Các dòng ngắt được đánh dấu bằng ":". Các dòng có điểm ngắt được đánh dấu bằng "b" và
những người có hành động bằng "a". Dòng sắp được thực hiện được đánh dấu bằng
"==>".
Xin lưu ý rằng mã trong danh sách trình gỡ lỗi có thể không giống với mã của bạn
mã nguồn gốc. Chỉ thị dòng và bộ lọc nguồn bên ngoài có thể thay đổi
mã trước khi Perl nhìn thấy nó, làm cho mã di chuyển từ các vị trí ban đầu của nó hoặc lấy
trên các hình thức hoàn toàn khác nhau.
Khung danh sách
Khi tùy chọn "khung" được đặt, trình gỡ lỗi sẽ in được nhập (và tùy chọn
thoát ra) các chương trình con theo các kiểu khác nhau. Xem perldebguts lâu vô cùng
ví dụ về những điều này.
Gỡ lỗi Thời gian biên dịch Báo cáo
Nếu bạn có các câu lệnh thực thi thời gian biên dịch (chẳng hạn như mã trong BEGIN, UNITCHECK và
CHECK khối hoặc câu lệnh "sử dụng"), những điều này sẽ không bị dừng bởi trình gỡ lỗi, mặc dù
Các khối "request" và INIT sẽ và các câu lệnh thời gian biên dịch có thể được theo dõi bằng
Đã đặt tùy chọn "AutoTrace" trong "PERLDB_OPTS"). Tuy nhiên, từ mã Perl của riêng bạn, bạn có thể
chuyển quyền kiểm soát trở lại trình gỡ lỗi bằng cách sử dụng câu lệnh sau, điều này là vô hại nếu
trình gỡ lỗi không chạy:
$ DB :: đơn = 1;
Nếu bạn đặt $ DB :: single thành 2, nó tương đương với việc bạn chỉ nhập lệnh "n", trong khi
giá trị 1 có nghĩa là lệnh "s". Biến $ DB :: theo dõi phải được đặt thành 1 thành
mô phỏng việc gõ lệnh "t".
Một cách khác để gỡ lỗi mã thời gian biên dịch là khởi động trình gỡ lỗi, đặt một điểm ngắt trên
tải của một số mô-đun:
DB <7> b tải f: /perllib/lib/Carp.pm
Sẽ dừng khi tải 'f: /perllib/lib/Carp.pm'.
và sau đó khởi động lại trình gỡ lỗi bằng lệnh "R" (nếu có thể). Người ta có thể sử dụng "b biên dịch
tên con "cho cùng một mục đích.
Debugger Tùy biến
Trình gỡ lỗi có thể chứa đủ các móc cấu hình mà bạn sẽ không bao giờ phải
tự sửa đổi nó. Bạn có thể thay đổi hoạt động của trình gỡ lỗi từ bên trong trình gỡ lỗi
bằng cách sử dụng lệnh "o", từ dòng lệnh thông qua biến môi trường "PERLDB_OPTS",
và từ các tệp tùy chỉnh.
Bạn có thể thực hiện một số tùy chỉnh bằng cách thiết lập .perldb tệp, chứa khởi tạo
mã số. Ví dụ: bạn có thể tạo các bí danh như thế này (bí danh cuối cùng là bí danh mà mọi người mong đợi
ở đó):
$ DB :: alias {'len'} = 's / ^ len (. *) / P length ($ 1) /';
$ DB :: alias {'stop'} = 's / ^ stop (at | in) / b /';
$ DB :: bí danh {'ps'} = 's / ^ ps \ b / p vô hướng /';
$ DB :: bí danh {'bỏ'} = 's / ^ bỏ (\ s *) / thoát /';
Bạn có thể thay đổi các tùy chọn từ .perldb bằng cách sử dụng các cuộc gọi như thế này;
parse_options ("NonStop = 1 LineInfo = db.out AutoTrace = 1 frame = 2");
Mã được thực thi trong gói "DB". Lưu ý rằng .perldb được xử lý trước
đang xử lý "PERLDB_OPTS". Nếu như .perldb định nghĩa chương trình con "afterinit", hàm đó là
được gọi sau khi quá trình khởi tạo trình gỡ lỗi kết thúc. .perldb có thể được chứa trong hiện tại
thư mục, hoặc trong thư mục chính. Bởi vì tệp này được lấy nguồn bởi Perl và có thể
chứa các lệnh tùy ý, vì lý do bảo mật, nó phải thuộc sở hữu của người cấp cao hoặc
người dùng hiện tại và không ai có thể ghi được ngoài chủ sở hữu của nó.
Bạn có thể giả lập đầu vào TTY cho trình gỡ lỗi bằng cách thêm các lệnh tùy ý vào @DB :: typeahead. Vì
ví dụ, của bạn .perldb tệp có thể chứa:
sub afterinit {push @DB :: typeahead, "b 4", "b 6"; }
Điều này sẽ cố gắng thiết lập các điểm ngắt trên dòng 4 và 6 ngay sau trình gỡ lỗi
khởi tạo. Lưu ý rằng @DB :: typeahead không phải là giao diện được hỗ trợ và phải tuân theo
thay đổi trong các bản phát hành trong tương lai.
Nếu bạn muốn sửa đổi trình gỡ lỗi, hãy sao chép perl5db.pl từ thư viện Perl sang một tên khác
và hack nó vào nội dung trái tim của bạn. Sau đó, bạn sẽ muốn đặt môi trường "PERL5DB" của mình
biến để nói một cái gì đó như thế này:
BEGIN {request "myperl5db.pl"}
Phương án cuối cùng, bạn cũng có thể sử dụng "PERL5DB" để tùy chỉnh trình gỡ lỗi bằng cách trực tiếp
thiết lập các biến nội bộ hoặc gọi các hàm trình gỡ lỗi.
Lưu ý rằng bất kỳ biến và hàm nào không được ghi lại trong tài liệu này (hoặc trong
perldebguts) chỉ được coi là sử dụng nội bộ và do đó có thể thay đổi
mà không cần thông báo trước
Đường dây đọc cá nhân hóa / Lịch Sử in các Debugger
Khi được vận chuyển, lịch sử dòng lệnh duy nhất được cung cấp là một lịch sử đơn giản giúp kiểm tra
hàng đầu dấu chấm than. Tuy nhiên, nếu bạn cài đặt Thuật ngữ :: ReadKey và Thuật ngữ :: ReadLine
mô-đun từ CPAN (chẳng hạn như Term :: ReadLine :: Gnu, Term :: ReadLine :: Perl, ...) bạn sẽ có
khả năng chỉnh sửa đầy đủ giống như GNU đó đường dẫn(3) cung cấp. Tìm kiếm những thứ này trong
mô-đun / theo mô-đun / Thuật ngữ thư mục trên CPAN. Những điều này không hỗ trợ bình thường vi dòng lệnh
chỉnh sửa, tuy nhiên.
Tính năng hoàn thành dòng lệnh thô sơ cũng có sẵn, bao gồm các biến từ vựng trong
phạm vi hiện tại nếu mô-đun "PadWalker" được cài đặt.
Nếu không hỗ trợ Readline, bạn có thể thấy các ký hiệu "^ [[A", "^ [[C", "^ [[B", "^ [[D" "," ^ H ",
... khi sử dụng các phím mũi tên và / hoặc phím xóa lùi.
Biên tập viên cá nhân hóa cho Gỡ lỗi
Nếu bạn có phiên bản GNU của emacs được cài đặt trên hệ thống của bạn, nó có thể tương tác với
Trình gỡ lỗi Perl để cung cấp một môi trường phát triển phần mềm tích hợp gợi nhớ đến
tương tác với trình gỡ lỗi C.
Các phiên bản Emacs gần đây đi kèm với một tệp bắt đầu để tạo emacs hoạt động như một cú pháp-
biên tập viên được chỉ đạo hiểu (một số) cú pháp của Perl. Xem perlfaq3.
Người sử dụng vi cũng nên xem xét khí lực và gwim, phiên bản chuột và có gió, để tô màu
từ khóa Perl.
Lưu ý rằng chỉ perl mới có thể thực sự phân tích cú pháp Perl, vì vậy tất cả các công cụ CASE như vậy hơi thiếu
đánh dấu, đặc biệt nếu bạn không lập trình Perl của mình như một lập trình viên C có thể.
Perl Profiler
Nếu bạn muốn cung cấp một trình gỡ lỗi thay thế để Perl chạy, hãy gọi tập lệnh của bạn với
dấu hai chấm và một đối số gói được cung cấp cho -d lá cờ. Các trình gỡ lỗi thay thế của Perl bao gồm một
Hồ sơ Perl, Devel :: NYTProf, có sẵn riêng biệt dưới dạng bản phân phối CPAN. Đến
hồ sơ chương trình Perl của bạn trong tệp mycode.pl, chỉ loại:
$ perl -d: NYTProf mycode.pl
Khi tập lệnh kết thúc, trình biên dịch sẽ tạo một cơ sở dữ liệu về thông tin hồ sơ
mà bạn có thể chuyển thành báo cáo bằng cách sử dụng các công cụ của trình biên dịch. Nhìn thấy để biết chi tiết.
Gỡ lỗi Đều đặn Biểu thức
"use re 'debug'" cho phép bạn xem chi tiết đẫm máu về cách biểu thức chính quy Perl
động cơ hoạt động. Để hiểu được sản lượng thông thường rất lớn này, người ta không chỉ phải
có một số ý tưởng về cách đối sánh biểu thức chính quy hoạt động nói chung, nhưng cũng biết cách
Biểu thức chính quy của Perl được biên dịch nội bộ thành một automaton. Những vấn đề này là
đã khám phá một số chi tiết trong "Gỡ lỗi Cụm từ Thông dụng" trong perldebguts.
Gỡ lỗi Bộ nhớ Sử dụng
Perl có hỗ trợ nội bộ để báo cáo việc sử dụng bộ nhớ của chính nó, nhưng đây là một
khái niệm nâng cao yêu cầu một số hiểu biết về cách hoạt động của cấp phát bộ nhớ. Nhìn thấy
"Gỡ lỗi sử dụng bộ nhớ Perl" trong perldebguts để biết chi tiết.
Sử dụng perldebug trực tuyến bằng các dịch vụ onworks.net