2014-04-04 22 views
5

Tôi viết phần mềm thực hiện một số phân tích tĩnh khá phức tạp và theo dõi động của các chương trình khác. Chương trình này sử dụng rất nhiều thông tin DWARF tĩnh để hỗ trợ truy tìm, bao gồm thông tin dòng/cột từ phần .debug_line DWARF. Để chương trình này có độ chính xác mà chúng tôi cần, nó phải có thông tin hàng và cột chính xác và chi tiết để được điền vào thông tin gỡ lỗi DWARF. Sử dụng clang Tôi có thể buộc thông tin hàng và cột được điền bằng cách sử dụng các tùy chọn -g -Xclang -dwarf-column-info cùng nhau.Làm thế nào để có thêm thông tin gỡ lỗi hàng/col chi tiết từ clang?

Tuy nhiên, có một số trường hợp mà tiếng kêu không tạo ra thông tin cột đủ chi tiết. Một ví dụ cụ thể là dành cho các vòng for. Uống theo chương trình ví dụ sau đây mà tôi sẽ đề cập đến như source01.c:

1  
    2 int main() 
    3 {  
    4  int number1 = 10, number2 = 20; 
    5  for (int i=0; i < 10; ++i) {                               
    6   number1++; 
    7   number2++; 
    8  } 
    9  return 0; 
10 } 

tôi có thể biên dịch nó như vậy:

clang -g -Xclang -dwarf-column-info source01.c 

nào sản xuất thực thi a.out. sau đó tôi sử dụng dwarfdump kiểm tra như thế nào thông tin hàng/cột đã được dân cư:

dwarfdump a.out > dwarf_info 

Nhìn vào phần .debug_line, tôi thấy tất cả các cặp hàng/col được chứa trong các thông tin gỡ lỗi thực thi này:

.debug_line: line number info for a single cu 
Source lines (from CU-DIE at .debug_info offset 0x0000000b): 

<pc>  [row,col] NS BB ET PE EB IS= DI= uri: "filepath" 
NS new statement, BB new basic block, ET end of text sequence 
PE prologue end, EB epilogue begin 
IA=val ISA number, DI=val discriminator value 
0x004004f0 [ 3, 0] NS uri: "/xxx/loop_01/source01.c" 
0x004004fb [ 4, 5] NS PE 
0x00400509 [ 5,10] NS 
0x0040051d [ 6, 9] NS 
0x00400528 [ 7, 9] NS 
0x00400533 [ 5,27] NS 
0x00400548 [ 9, 5] NS 
0x0040054a [ 9, 5] NS ET 

Như bạn thấy, có cặp (5,10), tương ứng với int i=0;, và cặp (5,27), tương ứng với ++i. Tuy nhiên, tôi sẽ mong đợi (và cần) có cũng là cặp (5,19), tương ứng với i < 10, nhưng nó không có ở đó. Tôi đã kiểm tra các hướng dẫn thực thi với objdump và đã xác nhận rằng thực sự có các hướng dẫn tương ứng với so sánh i < 10 (Do đó, nó không đơn giản là "tối ưu hóa").

Bạn có trực giác gì về việc tại sao clang không điền thông tin này? Hoặc có cách nào để ép buộc clang để tạo thêm thông tin chi tiết về cột không? Có vẻ như clang nên có khả năng này, vì các AST mà clang tạo ra có ánh xạ cực kỳ chi tiết giữa chính nó và hàng và cột mã nguồn.

Cảm ơn bạn.

+1

Vì đây đang diễn ra rất nhiều chưa được trả lời: Gần đây tôi có một câu hỏi thích hợp tương tự về Clang và quyết định cố gắng tìm trong [Mã nguồn] (http://clang.llvm.org/get_started.html). Tôi không có chuyên môn về trình biên dịch và tôi thậm chí không biết C++, nhưng tôi thấy thật dễ dàng để tìm thấy những gì tôi cần (xin đừng coi đây là "tôi thông minh hơn bạn" - tôi thực sự bị đe dọa bởi nó bắt đầu với). Có lẽ vấn đề của bạn khó hơn tôi, nhưng hãy cho nó đi! Hoặc, hãy yêu cầu [danh sách gửi thư] (http://clang.llvm.org/get_involved.html). Và đừng quên trả lời câu hỏi của riêng bạn sau .. – Brendan

+0

@Brendan Cảm ơn bạn đã bình luận! Có, chúng tôi (nhóm của tôi và tôi) đã xem xét đào bới thông qua nguồn và thực hiện một số sửa đổi để có được thông tin những gì chúng tôi muốn. Chúng tôi chắc chắn có thể sẽ đi tuyến đường đó trong tương lai. Tôi cũng đã đăng bài cho người dùng cfe (không phản hồi), nhưng tôi chưa thử đăng lên cfe-dev. – bddicken

Trả lời

0

Đây không phải là thực sự là một giải pháp rất nhiều như một cái cớ nhưng ...

Tôi tin rằng sự xâm nhập đầu tiên (5, 8) bao gồm mã cho cả những điều khoản và điều kiện khởi tạo trong vòng lặp for. Khi tôi biên dịch một chương trình với vòng lặp for, hai câu lệnh này kết thúc trong một dải địa chỉ liền kề.

Sẽ tốt hơn nếu ép buộc tạo một mục riêng biệt cho mỗi câu lệnh, nhưng dường như tôi không thể tìm thấy bất kỳ thứ gì có thể làm điều đó.

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