Tôi đang nhận được một phân đoạn lạ khi sử dụng libxml để phân tích cú pháp tệp. Mã này đã làm việc trước đây khi tôi biên dịch nó dưới dạng ứng dụng 32 bit. Tôi đã thay đổi nó thành một ứng dụng 64 bit và nó ngừng hoạt động.Lỗi ngoài giới hạn khi đọc xml
Các lỗi seg đến trong lúc "if (xmlStrcmp (cur-> tên, (const xmlChar *) "máy chủ"))"
cur-> tên là một xmlChar const * và nó trỏ đến một địa chỉ mà nói ra giới hạn của nó. Nhưng khi tôi gỡ lỗi và đi đến vị trí bộ nhớ đó, dữ liệu đó là chính xác.
int XmlGetServers()
{
xmlDocPtr doc;
xmlNodePtr cur;
doc = xmlParseFile("Pin.xml");
if (doc == NULL)
{
std::cout << "\n Pin.xml not parsed successfully." << std::endl;
return -1;
}
cur = xmlDocGetRootElement(doc);
if (cur == NULL)
{
std::cout << "\n Pin.xml is empty document." << std::endl;
xmlFreeDoc(doc);
return -1;
}
if (xmlStrcmp(cur->name, (const xmlChar *) "servers"))
{
std::cout << "\n ERROR: Pin.xml of the wrong type, root node != servers." << std::endl;
xmlFreeDoc(doc);
return -1;
}
}
Trước cur được khởi tạo tham số tên là
Name : name
Details:0xed11f72000007fff <Address 0xed11f72000007fff out of bounds>
Sau cur được khởi tạo tham số tên được
Name : name
Details:0x64c43000000000 <Address 0x64c43000000000 out of bounds>
Được tham chiếu XML tập tin
<?xml version="1.0"?>
<servers>
<server_info>
<server_name>Server1</server_name>
<server_ip>127.0.0.1</server_ip>
<server_data_port>9000</server_data_port>
</server_info>
<server_info>
<server_name>Server2</server_name>
<server_ip>127.0.0.1</server_ip>
<server_data_port>9001</server_data_port>
</server_info>
</servers>
hệ thống:
OS: Redhat Enterprise Linux 6.4 64-bit
GCC: 4.4.7-3
gói: libxml2-2.7.6-8.el6_3.4.x86_64
Bạn có phiên bản 64 bit của libxml không? – vmg
yes libxml2-2.7.6-8.el6_3.4.x86_64 – user758114
Bạn đã thử chạy ứng dụng bằng valgrind, như Sam Varshavchik đã làm chưa? –