進斷點控制臺有報錯之后,復制報錯信息到 頭部菜單欄
1.編輯 -> 2.Find/Replace? ->3.Advanced Find ->4. Project“xxxxx” 能找到問題點
再分析定位
在排查報錯時候,進入了這個報錯,msgInfo = "MyTcpRedis: Failed to convert string to integer of varId variable!"
C++ 代碼:
//依據設備io地址從redis中查找變量
bool MyTcpRedis::searchVariabeByIoAddr(const QString& ip, quint16 ioAddr, quint32 *varId)
{bool ok;quint16 t;QString sid;QString msgInfo;if ((m_redis) && (m_redis->isConnected())) {//依據varID讀取ip和ioAddr,io_addr_var_id(string)sid = devIoAddrToVarIdTbl + ":" + ip + ":" + QString::number(ioAddr);t = m_redis->get(sid).toUInt(&ok);if (!ok) {msgInfo = "MyTcpRedis: Failed to convert string to integer of varId variable!";MyDebug::print(msgInfo);return false;}*varId = t;return true;}return false;
}
當出現 "Failed to convert string to integer" 這個錯誤時,意味著從 Redis 讀取回來的字符串無法成功轉換為無符號整數。主要原因如下:
- 鍵值不存在:在 Redis 里,對應的鍵可能并不存在,此時獲取到的就是空字符串。
- 數據格式有誤:鍵對應的值也許不是合法的整數字符串,像包含了字母、特殊符號等情況。
- 數值范圍不匹配:就算字符串是合法的整數,但如果超出了
quint16
(也就是 0 - 65535)的范圍,也會導致轉換失敗。
核實 Redis 中的數據情況
redis-cli get "io_addr_var_id:設備IP:IO地址"
- 若返回 (nil):這表明鍵不存在,你就得檢查鍵的格式或者數據是否成功寫入。
- 若返回非整數字符串:例如 "abc"、"123.45",那就要修正數據寫入的邏輯。
- 若返回的整數值超出范圍:比如大于 65535,就需要把存儲類型改成
quint32
。