2014-03-19 104 views
1

当我在我的电脑上运行我的程序时,一切都按预期工作。但最近我已经将应用程序移动到运行Ubuntu 12.04的Wandboard dual(与我的电脑相同)。该程序的结构类似于:用代码01退出的C++程序没有执行代码

... 
headers 
... 

bool continueStuff = true; 

log4cplus::Logger makeLogger(std::string str) 
{ 
    ... 
    Init custom loggers 
    make loggers 
    set properties 
    return logger 
} 

log4cplus::Logger logger = makeLogger("MainLogger"); 
void signalHandler(int signum) 
{ 
    switch(signum) 
    { 
     // Fatal signals 
     case 1: 
     case 2: 
     case 3: 
     case 4: 
     case 6: 
     case 8: 
     case 9: 
     case 10: 
     case 11: 
     case 12: 
     case 13: 
     case 14: 
     case 15: 
      printf("Fatal signal(%d) received. Shutting down\n", signum); 
      LOG4CPLUS_FATAL(logger, "Fatal signal(" << signum << ") received. Shutting down."); 

      exit(signum); 
      break; 

     // Non-fatal signals 
     default: 
      LOG4CPLUS_INFO(logger, "Non-fatal signal(" << signum << ") received."); 
    } 
} 

... 
functions 
... 

int main() 
{ 
    printf("Starting\n"); 
    signal(SIGINT, signalHandler); 
    ... 
} 

该程序编译完美罚款在电子白板上,但是当我运行它立即退出。我试过通过gdb在main方法中设置断点,全局变量声明和main之前调用的任何构造函数来运行它。我在所有在main之前执行的代码中都有打印语句,但没有打印任何内容。

g ++版本与我的机器和电子书板上的版本相同。 库都是相同的版本(除了一个),但我不认为这是问题,因为我没有看到任何编译器错误。

我也永远不会返回一个正面的退出状态,我的应用程序或者返回0成功或-1失败。正如你在上面的代码中看到的,我还处理程序接收到的所有信号,并在退出之前打印并显示错误消息。

UPDATE:

的valgrind输出:

==18828== Command: ./app 
==18828== Parent PID: 18092 
==18828== 
==18828== Jump to the invalid address stated on the next line 
==18828== at 0x388: ??? 
==18828== Address 0x388 is not stack'd, malloc'd or (recently) free'd 
==18828== 
==18828== 
==18828== Process terminating with default action of signal 11 (SIGSEGV) 
==18828== Bad permissions for mapped region at address 0x388 
==18828== at 0x388: ??? 
==18828== 

更新2:

我使用的是预编译库中,从读取输出后: readelf -aw libPrecompileLib.so 我发现它是为cortex-a9处理器编译的,其中所有的系统库都是w已编译为7-A处理器。由于图书馆无法与系统交谈,因此无法运行。

我可以为我的应用程序编译cortex-a9处理器吗?

我曾尝试:

g++ -mcpu=cortex-a9 -c src.cpp -o app 

但是由于因为没有被链接(按照-c),它不是可执行文件。然而,一旦我删除了-c,readelf输出就表示它是7-A。

+0

除非我误会,否则您正在调用'exit(signum)'来强制终止程序,并且不执行后面的代码。 – CoryKramer

+0

@Cyber​​这是他的信号处理程序,除非发出信号才执行。 –

+0

@瑞克,但如果出现信号,您会退出,并显示正面退出代码。 –

回答

0

http://linux.die.net/man/2/signal 注意催促你的部分使用sigaction因为signal不是很便携。

+0

虽然这是真的,并且可能会在稍后导致问题,但我在我的机器和电子白板上运行Ubuntu 12.04以及使用相同版本的g ++编译应用程序。因此,它们之间不应存在可移植性问题。 – Rick