Tôi đang cố tạo móc trên chức năng hệ thống open()
. Tôi đã thực hiện điều này dọc theo các dòng sau.Lỗi phân đoạn từ móc khi mở()
Tôi tạo ra một thư viện wrapper như sau:
extern int mocked_open(const char* fn, int flags, va_list args);
int open(const char* fn, int flags, ...)
{
int r = -1;
va_list args;
va_start(args, flags);
r = mocked_open(fn, flags, args);
va_end(args);
return r;
}
tôi biên dịch này vào libwrapper.so, mà tôi tải sử dụng LD_PRELOAD.
Việc thực hiện mocked_open()
là như sau (tôi sử dụng khuôn khổ CPPUtest):
int mocked_open(const char* fn, int flags, va_list args)
{
if (strncmp(fn, test_device_id, 11) == 0)
{
return mock().actualCall("open").returnValue().getIntValue();
}
else
{
int r = -1;
int (*my_open)(const char*, int, ...);
void* fptr = dlsym(RTLD_NEXT, "open");
memcpy(&my_open, &fptr, sizeof(my_open));
if (flags & O_CREAT)
{
r = my_open(fn, flags, va_arg(args, mode_t));
}
else
{
r = my_open(fn, flags);
}
return r;
}
}
Các test_device_id
là một chuỗi đơn giản ("test_device"), mà tôi hy vọng không được sử dụng ở những nơi khác.
Trong khi chạy thử nghiệm, lỗi thực thi có lỗi phân đoạn. Tôi đã theo dõi điều này xuống chức năng lược tả GCC, mà muốn mở/tạo một bó các tệp .gcda
và gọi open()
cho việc này.
Sau khi một số gỡ rối với strace (mỗi gợi ý dưới đây), tôi thấy rằng dòng r = my_open(fn, flags, va_arg(args, mode_t));
thực sự là thủ phạm. Nó được gọi là đệ quy, hoặc có vẻ như: Tôi thấy rất nhiều cuộc gọi đến dòng này, mà không có hàm trả về. Sau đó, một segfault. Tệp đang được mở là tệp .gcda tương ứng (để lược tả). Trong thực tế, segfault chỉ xảy ra với hồ sơ được kích hoạt.
Tôi nghĩ rằng sự cố của bạn là xử lý variadic http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c – user590028
@ user590028: bạn có thể xây dựng không? Tôi đã tìm thấy có điều gì đó sai với xử lý đối số variadic (như tôi đã viết), nhưng cái gì ...? – Ludo
Loại cuộc gọi nào để 'mở()' hiển thị 'strace' được sử dụng trong các trường hợp thử nghiệm của bạn? – alk