希望我能在不遗漏关键细节的情况下简化它......
我有一个测试程序:
#include <lib.h>
const char * INPUT = "xyz";
int main()
{
initializeLib();
LibProcess * process = createLibProcess();
fprintf( stderr, "Before run(%s)\n", INPUT );
process->run(INPUT);
fprintf( stderr, "After run(%s)\n", INPUT );
return 0;
}
这个测试程序我编译(gcc 4.1.2)并运行为:
g++ -g -o test test.c -L /path/to/lib -I /path/to/include -lnameoflib
export LD_LIBRARY_PATH=/path/to/lib
./test
这个库相当复杂,在某些地方不太智能,最重要的是不是我写的,所以不要因为所涉及的功能的架构而责怪我:
class ProcessBase
{
public:
virtual int run( const char* buffer = NULL ) = 0;
}
class LibProcess : ProcessBase
{
public:
LibProcess()
{
fprintf( "Reached LibProcess().\n" );
}
int run( const char* buffer = NULL )
{
fprintf( stderr, "Reached run().\n" );
}
};
void initializeLib()
{
// Preparing some data
}
ProcessBase * createLibProcess()
{
ProcessBase * process = new LibProcess();
fprintf( stderr, "Created Process.\n" );
return (ProcessBase *) process;
}
到目前为止,一切都很好。但它的输出确实让我困惑:
Reached LibProcess().
Created Process.
Before run(xyz)
SEGFAULT
我知道错误(很可能)是在完全不同的地方。但是这怎么可能呢?
我会理解测试是否在第一次调用库时失败。我会理解测试是否在创建进程时终止,或者当它实际上在 run() 中执行某些操作时终止。
但是在调用函数和实际到达该函数之间它怎么会死掉呢?
我一无所知,尤其是我不知道如何继续调试这个。帮忙?
编辑:是的,我在 createLibProcess() 之后检查了进程是否有非 NULL 值。随后对 process 的两个不同成员函数的调用(未包含在示例中)也运行得很好。但是第二个成员函数调用由于缓冲区溢出而破坏了内存,并将进程清零。
这使得问题无效。 当然调用 NULL->run() 是一种段错误。
问题可以作为“不再相关”而关闭。不管怎样,谢谢!
最佳答案
如果:
LibProcess * process = createLibProcess();
返回 NULL,或者进程在某种程度上无效,您将得到与您所看到的完全相同的行为。
关于c++ - 调用库时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305132/