1

我正在编写一个简单的应用程序来纠正存储在数据库中的二进制 blob 中的某个字节。我使用 OTL 将我的 C++ 程序连接到数据库。读取数据和操作工作正常,但是当我想将它写回数据库时,程序就死了。

编码:

try
{
    std::string updateQuery = "UPDATE tbtptemplates "
                  "  SET tptemplate=:tp<BLOB> "
                  "WHERE afisid=:aid<INT>";

    otl_long_string blob(&stp(), theSizeOfBlob);
    blob.set_len(theSizeOfBlob);

    otl_stream str(1, updateQuery.c_str(), theDbConnection);
    str.set_lob_stream_mode(true);
    str.set_commit(0);

    otl_lob_stream lob;
    lob.set_len(theSizeOfBlob);

    str << lob;
    str << theCurrentAfisId;
    lob << blob;
    lob.close();
}
catch (const otl_exception &oe)
{
    std::cerr << oe.msg;
    throw std::runtime_error("could not write to database");
}

例如,我在 Sourceforge 进行了间谍活动。

我创建了一个获取数据的 otl_long_string。然后我创建一个 otl_stream 并将 SQL 语句和数据库连接放在一起。我使用 otl_lob_stream 将二进制数据提供给 otl_stream。将 blob 数据流式传输到 otl_stream 工作正常。但是当我将 id 交给流时,进程就会终止。

这是杀手级指令:

str << theCurrentAfisId;

这是我交出的一个简单的 int 变量。效果很搞笑:进程并没有完全死掉,只是当前方法下面的调用栈没了。这是语句之前的调用堆栈:

Thread #1 [fix_stp] 10307 [core: 7] (Suspended : Breakpoint)    
    Drm::TPFixer::DatabaseConnector::writeDB() at DatabaseConnector.cpp:224 0x40b565    
    Drm::TPFixer::DatabaseConnector::fixImpressiontype() at DatabaseConnector.cpp:139 0x40b516  
    Drm::TPFixer::SuperTemplateManager::fixImpressiontype() at SuperTemplateManager.cpp:67 0x4074e3 
    main() at main.cpp:51 0x40477b  

这是指令的完整堆栈:

Thread #1 [fix_stp] 10307 [core: 7] (Running : Step)    
    Drm::TPFixer::DatabaseConnector::writeDB() at DatabaseConnector.cpp:240 0x40b6b2    

我试图调试otl。似乎 otl 发现它已获得所有必需的参数并开始运行。在那一刻,它崩溃了。

我使用的环境:
- OTL 4.0
- CentOS Linux,内核 3.10.0-327.22.2.el7.x86_64
- gcc-Version 4.8.5
- Oracle 11g

有人有想法吗?

4

0 回答 0