我是一名有用的助手,可以为您翻译文本。
我在Ubuntu 14.04中使用C语言的sqlite3。在我的进程中,我每20分钟更新一次数据库。
以下是我的函数代码:
当
如果我注释掉
为什么我不能打印错误消息?
但我仍然收到一个分段错误的消息。
错误地址指向第一个 printf 函数。
为什么?请帮帮我。谢谢。
我在Ubuntu 14.04中使用C语言的sqlite3。在我的进程中,我每20分钟更新一次数据库。
以下是我的函数代码:
int update_alive_state(uint64_t ieee,bool isAlive)
{
char *error_report = NULL;
char sql[100];
int result = -1;
UpdateAliveStateSql(sql,ieee,isAlive);
if(result = sqlite3_exec(db_event, sql, 0, 0, &error_report))
{
printf( "\t> CMD: %s , Error: %s\n" , sql , error_report );
sqlite3_free(error_report);
}
return result;
}
当
sqlite3_exec()
返回错误并打印错误消息时,我会收到分段错误消息并终止进程。ERROR: signal 11 was trigerred:
Fault address: 0xae703f1b
Fault reason: address not mapped to object
Stack trace folows:
./main.bin(segmentation_fault_handler+0xd5)[0x419e9f]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10330)[0x7fa386f20330]
/lib/x86_64-linux-gnu/libc.so.6(_IO_vfprintf+0x1d03)[0x7fa386257943]
/lib/x86_64-linux-gnu/libc.so.6(_IO_printf+0x99)[0x7fa3862603d9]
./main.bin(update_alive_state+0x15d)[0x43ca78]
./main.bin(EventScanThread+0x2af)[0x442c21]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x8184)[0x7fa386f18184]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7fa38630637d]
Executing original handler...
如果我注释掉
printf
和sqlite3_free
,段错误的消息就会消失。为什么我不能打印错误消息?
请帮帮我。
编辑:
我把我的代码改成了这样
if(result = sqlite3_exec(db, sql, 0, 0, &error_report))
{
printf( "[ERR] : \t> CMD: %s , Error: %d\n" , sql , result );
if ( error_report )
{
printf( "[ERR] : Error msg: %s\n", error_report );
sqlite3_free(error_report);
}
}
但我仍然收到一个分段错误的消息。
ERROR: signal 11 was trigerred:
Fault address: 0x7f3dc490cf1b
Fault reason: address not mapped to object
Stack trace folows (partial):
./main.bin(segmentation_fault_handler+0xd5)[0x419e9f]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10330)[0x7fab749ac330]
/lib/x86_64-linux-gnu/libc.so.6(_IO_vfprintf+0x1d03)[0x7fab73ce3943]
/lib/x86_64-linux-gnu/libc.so.6(_IO_printf+0x99)[0x7fab73cec3d9]
./main.bin(update_last_receive_time+0x166)[0x43d60e]
./main.bin(attr_process_attribute_report_ind+0x97)[0x4222dc]
./main.bin(si_gateway_incoming_data_handler+0xa3)[0x41b6b1]
./main.bin(tcp_socket_event_handler+0x558)[0x41c316]
./main.bin(polling_process_activity+0xde)[0x41a4e1]
./main.bin(main+0x150)[0x41a0f4]
Executing original handler...
错误地址指向第一个 printf 函数。
printf( "[ERR] : \t> CMD: %s , Error: %d\n" , sql , result );
为什么?请帮帮我。谢谢。
error_report
的值是什么?它可能是一个空指针吗? - Some programmer dudesqlite3_exec
函数的最后一个参数需要一个char
类型的双指针,但是你却像打印普通字符串一样打印了它(error_report
)。 - Federico klez Cullocasqlite3_exec
函数期望一个指向指针(指向char
)的指针作为模拟传递引用的方式,因此它可以将原始指针设置为指向字符串。而 OP 正确地将正确的东西传递给了sqlite3_exec
(指向指针的指针到char
),由于它应该是一个字符串,所以打印为字符串也是正确的。问题可能是,正如我在之前的评论中提到的那样,没有错误消息,sqlite3_exec
将error_report
作为空指针留下。 - Some programmer dude