Để đặt nhẹ nhàng, tôi có vấn đề về bộ nhớ nhỏ và đang hết công cụ và ý tưởng để tách biệt nguyên nhân.Các công cụ để cô lập lỗi đập ngăn xếp
Tôi có một chương trình C/C++ đa luồng (đa luồng) đã phát triển một sự cố ngăn xếp theo các biên dịch tối ưu hóa với GCC sau 4.4.4 và trước 4.7.1.
Triệu chứng là trong khi tạo một trong các chủ đề, tôi nhận được một ngăn xếp đầy đủ, không chỉ RIP, nhưng tất cả các khung cha và hầu hết các thanh ghi là 0x00 hoặc địa chỉ không có ý nghĩa khác. Chủ đề nào gây ra vấn đề dường như là ngẫu nhiên, tuy nhiên việc đánh giá bằng các thông điệp tường trình có vẻ như được tách biệt với cùng một đoạn mã, và dường như có một điểm bán lặp lại trong quá trình tạo chuỗi mới. Điều này đã làm cho nó rất khó để bẫy và cô lập mã vi phạm hẹp hơn so với một đơn vị biên dịch duy nhất của hàng ngàn dòng, vì print() trong tập tin vi phạm cho đến nay tỏ ra không đáng tin cậy khi cố gắng thu hẹp xuống phần hoạt động.
Việc tạo chủ đề dẫn tắt các chủ đề mà cuối cùng đập vỡ chồng là:
extern "C"
{
static ThreadReturnVal ThreadAPI WriterThread(void *act)
{
Recorder *rec = reinterpret_cast (act);
xuint64 writebytes;
LoggerHandle m_logger = XXGetLogger("WriterThread");
if (SetThreadAffinity(rec->m_cpu_mask))
{ ... }
SetThreadPrio((xint32)rec->m_thread_priority);
while (true)
{
... poll a ring buffer ... Hard Spin 100% use on a single core, this is that sort of crazy code.
}
}
Tôi đã thử một debug xây dựng, nhưng các triệu chứng chỉ xuất hiện trong tối ưu hóa xây dựng, -O2 hoặc tốt hơn. Tôi đã thử Valgrind/memcheck và DRD nhưng cả hai không tìm thấy bất kỳ vấn đề trước khi ngăn xếp được thổi đi (và mất khoảng 12hr để đạt được sự thất bại)
Một biên dịch với -O2 -Wstack-bảo vệ thấy không có gì sai, tuy nhiên một bản xây dựng với -fstack-protector-tất cả đều bảo vệ tôi khỏi lỗi, nhưng phát ra không có lỗi.
Hàng rào điện cũng bẫy, nhưng chỉ sau khi ngăn xếp hết.
Câu hỏi: Các công cụ hoặc kỹ thuật nào khác hữu ích trong việc thu hẹp phần vi phạm?
Rất cám ơn, --Bill
OK. Tôi sẽ cắn ... ngăn xếp nào bị đập vỡ? –
Nếu đó là ngăn xếp của chuỗi tạo, một số mã có thể đẹp - bạn đang chuyển các tham số nào cho chuỗi mới/s? –
Chỉ cần cho rõ ràng, là bạn nói rằng nó hoạt động tốt trên g ++ 4.4.2 và 4.8 hoặc rằng những phiên bản đã không được thử nghiệm? –