Làm thế nào để xác định vị trí mã nguồn thực hiện một tính năng nhất định? [đóng cửa]


14

Tôi đã tự hỏi một số kỹ thuật để xác định mã nào đã triển khai một tính năng cụ thể, trên một ứng dụng máy tính để bàn.

Tôi là một nhà phát triển cơ sở, chỉ có kinh nghiệm lập trình chuyên nghiệp nằm xung quanh lập trình web. Trong Web dễ dàng hơn để làm điều đó. Ví dụ: bạn "kiểm tra" một nút bằng các công cụ trình duyệt và bạn có thể thấy những gì đang được thực hiện khi bạn nhấp vào nút đó. Và sau đó, giả sử bạn có mã nguồn đầy đủ, bạn có thể xem chi tiết thứ bậc của các cuộc gọi.

Nhưng làm thế nào để bạn làm điều này trong các ứng dụng máy tính để bàn? Ít nhất, mà không cần phải đi sâu vào codebase đầy đủ?


6
Thay vì đọc qua mã, đôi khi bạn có thể sử dụng trình gỡ lỗi. Cách thức hoạt động (và mức độ thân thiện với người dùng dành cho bạn) phụ thuộc vào ngôn ngữ, trình gỡ lỗi và giao diện trình gỡ lỗi được sử dụng. Trong mọi trường hợp, sử dụng trình gỡ lỗi là một nghệ thuật cần phải học - nhưng một khi nó đã học thì đó là một công cụ rất mạnh. Tôi nên học cách sử dụng một mình một thời gian.
amon

Và tôi nên thiết lập các điểm dừng ở đâu?
py_script

Việc thiết lập điểm dừng phụ thuộc hoàn toàn vào ứng dụng của bạn và cách thức tổ chức.

2
Thật sự có thể hơi khó để "kiểm tra" và xem các giao diện web được tạo ra ở đâu và như thế nào, với các hệ thống hướng đối tượng mới như Backbone.js và các mẫu đang trở nên phổ biến hơn.
NoBugs

1
@jeffo Khi bạn làm, ví dụ, Tệp-> Mở trong một ứng dụng (giả sử Nhà văn của LibreOffice) làm thế nào bạn có thể tìm thấy chuỗi cuộc gọi đằng sau đó là gì?
py_script

Câu trả lời:


21

Truy tìm lại

Truy tìm lại là định vị điểm cuối cho một sự kiện được liên kết với tính năng (xem bên dưới). Khi đó, một điểm dừng được đặt trong trình gỡ lỗi. Tính năng này được kích hoạt và khi trình gỡ lỗi dừng lại. Ngăn xếp cuộc gọi được xem xét để quay lại đường dẫn cuộc gọi. Trong khi đi lên ngăn xếp cuộc gọi, bạn có thể ghi chú vào các trạng thái khác nhau hoặc đặt các điểm dừng mới để kiểm tra lại sự kiện.

Tính năng này được kích hoạt một lần nữa và trình gỡ lỗi dừng tại các điểm dừng mới. Sau đó, bạn có thể lặp lại theo dõi trở lại hoặc thực hiện theo dõi về phía trước cho đến khi tìm thấy mục tiêu.

Ưu và nhược điểm

  • Luôn dễ dàng hơn để đi lên ngăn xếp cuộc gọi và xem bạn đã đến một nơi nào đó.
  • Có thể có hàng triệu điều kiện cần phải đúng trước khi đạt đến điểm cuối. Nếu bạn biết điểm cuối đã tiết kiệm cho mình rất nhiều công việc.
  • Nếu tính năng bị hỏng. Bạn có thể không bao giờ đạt đến điểm cuối, và thời gian có thể bị lãng phí khi cố gắng tìm hiểu tại sao.

Khám phá điểm cuối

Để gỡ lỗi một tính năng, bạn phải biết nơi mã nguồn đạt được mục tiêu cuối cùng. Chỉ từ thời điểm này, bạn có thể quay lại để xem làm thế nào mã đã đến đó. Một ví dụ; Để hiểu cách hoàn tác được thực hiện. Bạn biết nơi nào trong mã được hoàn tác, nhưng bạn không biết làm thế nào mọi thứ đến đó . Đây sẽ là một ứng cử viên cho backtracing để tìm ra cách tính năng này hoạt động.

Chuyển tiếp truy tìm

Chuyển tiếp theo dõi là định vị điểm bắt đầu cho một sự kiện được liên kết với một tính năng (xem bên dưới). Khi đó, thông điệp đăng nhập được chèn vào mã nguồn hoặc điểm dừng được đặt. Quá trình này được lặp lại khi bạn tiến xa hơn từ điểm bắt đầu cho đến khi bạn phát hiện ra các mục tiêu cho tính năng này.

Ưu và nhược điểm

  • Đó là điểm khởi đầu dễ dàng nhất để tìm một tính năng.
  • Độ phức tạp của mã làm giảm hiệu quả của việc truy tìm phía trước. Càng có nhiều điều kiện trong mã, cơ hội bạn đi sai hướng càng lớn.
  • Chuyển tiếp theo dõi thường dẫn đến việc thiết lập các điểm dừng sẽ được kích hoạt bởi các sự kiện không liên quan. Làm gián đoạn quá trình gỡ lỗi và can thiệp vào tìm kiếm của bạn.

Điểm bắt đầu khám phá

Bạn có thể sử dụng từ khóa, số nhận dạng giao diện người dùng (ID nút, tên cửa sổ) hoặc dễ dàng tìm thấy trình nghe sự kiện được liên kết với tính năng này. Ví dụ: bạn có thể bắt đầu với nút được sử dụng để kích hoạt tính năng hoàn tác .

Quá trình loại bỏ

Bạn có thể coi đây là điểm giữa so với vị trí điểm bắt đầuđiểm cuối . Bạn thực hiện quá trình loại bỏ khi bạn đã biết một đoạn mã được sử dụng trong một tính năng, nhưng nó không phải là sự khởi đầu hay kết thúc của tính năng.

Hướng bạn đi từ điểm giữa phụ thuộc vào số lượng mục nhập và thoát. Nếu đoạn mã được sử dụng ở nhiều nơi, thì việc truy ngược lại từ vị trí này có thể rất tốn thời gian vì tất cả chúng phải được kiểm tra. Sau đó, bạn sử dụng một quá trình loại bỏ để giảm danh sách này. Thay vào đó, bạn có thể thực hiện theo dõi chuyển tiếp từ thời điểm này, nhưng một lần nữa nếu đoạn mã phân nhánh ra nhiều nơi thì đây cũng có thể là một vấn đề.

Bạn phải giảm chỉ đường vị trí bằng cách không theo các đường dẫn rõ ràng sẽ không được thực thi cho tính năng. Di chuyển qua mã này và chỉ đặt các điểm dừng ở nơi có khả năng liên quan đến tính năng.

Gỡ lỗi điểm giữa thường đòi hỏi nhiều tính năng IDE nâng cao hơn. Khả năng xem phân cấp mã và phụ thuộc. Không có những công cụ đó thật khó để làm.

Ưu và nhược điểm

  • Điểm giữa thường là những đoạn mã đầu tiên xuất hiện trong đầu bạn khi bạn nghĩ về tính năng này. Bạn tự nhủ "Ah, điều đó phải sử dụng XXXX để hoạt động."
  • Điểm giữa có thể tiết lộ điểm bắt đầu dễ nhất.
  • Điểm giữa có thể là một cách dễ dàng để chọn đường dẫn đến một tính năng khi bị mất do đồng bộ hóa hoặc thay đổi luồng.
  • Điểm giữa có thể đưa bạn đến mã mà bạn không quen thuộc. Chi phí thời gian của bạn để tìm hiểu những gì đang xảy ra.

Cảm ơn Matthew, cách tiếp cận tuyệt vời. Nhưng làm thế nào để bạn tìm thấy một điểm khởi đầu (xin lỗi nếu nó rõ ràng cho tất cả trừ tôi)?
py_script

@py_script Bạn đang gặp rắc rối với ngôn ngữ lập trình nào?
Phản ứng

Đây không phải là vấn đề cụ thể mà tôi gặp phải, nhưng ngôn ngữ lập trình máy tính để bàn chính của tôi là Java, vì vậy hãy giải quyết nó
py_script

11

Giả sử rằng tính năng này được gắn với một số giao diện người dùng, như Nút hoặc Menu, những gì tôi có xu hướng làm theo (rất tẻ nhạt nhưng nó hoạt động). Đây là xem qua Mã nguồn, không sử dụng trình gỡ lỗi .

  1. Tìm kiếm văn bản (hy vọng đặc biệt) trên nút, ví dụ: "Super Feature X3".
  2. Đó có thể là trong một tập tin với một số hằng số, ví dụ SUPER_BUTTON_3 = "Super Feature X3". Để tham khảo trong tương lai, hãy nhớ tên tập tin này.
  3. Có thể có một lớp trừu tượng khác (thậm chí là hai), tiếp tục tìm kiếm để có được Chuỗi "thực" được Nút sử dụng. Lưu ý làm thế nào điều này được thực hiện cho tương lai.
  4. Bây giờ tìm kiếm trên hằng số đó. Hy vọng rằng bây giờ bạn đã tìm thấy Nút. Có lẽ đó là nơi họ kết nối ActionListener. (Tôi đang dùng Java-ese ở đây, YMMV, nhưng khái niệm này vẫn giữ)
  5. Nếu cần, hãy tìm kiếm trên Nút đó và cuối cùng bạn sẽ tìm thấy nơi nó được kết nối với Trình nghe.
  6. Có lẽ người nghe đó thực sự chuyển hướng đến những người nghe khác (chức năng "thực") dựa trên hằng số, nếu vậy, hãy làm theo điều đó nếu / khác hoặc tuyên bố trường hợp. LƯU Ý : Nếu có một thứ công văn trung tâm, đây là một nơi tuyệt vời để thiết lập các điểm dừng .
  7. Cuối cùng, bạn nên ở mã thực tế.

Như @amon đã lưu ý, đôi khi Trình gỡ lỗi đơn giản hơn ...


Một điều thú vị ... rất may những cái tên như vậy thường được mã hóa cứng trong mã :)
py_script

3
  • Nếu bạn có thể tìm thấy bất kỳ mã liên quan nào, bạn có thể sử dụng phần mềm kiểm soát nguồn của mình để hiển thị cho bạn toàn bộ cam kết hoặc các cam kết gần đó đã thêm nó. Điều đó sẽ cho bạn thấy mọi thứ được yêu cầu để thực hiện tính năng đó.

  • Một cách dễ dàng để tìm một số điểm bắt đầu để tìm sẽ là grep thông qua cơ sở mã của bạn đang tìm kiếm văn bản trên nút.

  • Thông thường, mọi người sẽ đặt id vấn đề từ trình theo dõi vấn đề của họ trong các thông điệp cam kết của họ. Nếu bạn có thể tìm thấy một vấn đề mô tả yêu cầu tính năng, thì bạn có thể tìm kiếm các cam kết với id vấn đề đó.


Đó là một cách tiếp cận thông minh nhưng tôi nghĩ nó chỉ hoạt động trên môi trường công ty. Điều gì nếu bạn chỉ có một tarball?
py_script
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.