2015-02-24 95 views
2

當我執行在我的嵌入式Linux沒有下面的程序發生了:如何解釋strace的輸出

#include <boost/thread/thread.hpp> 
#include <boost/lockfree/spsc_queue.hpp> 
#include <iostream> 

#include <boost/atomic.hpp> 

void Test(void) 
{ 
    std::cout << "Hello World" << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    std::cout << "init"; 

    boost::thread producer_thread(Test); 

    producer_thread.join(); 

    std::cout << "end"; 
} 


# ./prog -> nothing happens here 

最後從strace的輸出幾行:

open("/lib/libboost_thread.so.1.55.0", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\240\272\0\0004\0\0\0"..., 512) = 512 
lseek(3, 95536, SEEK_SET)    = 95536 
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1200) = 1200 
lseek(3, 95226, SEEK_SET)    = 95226 
read(3, "A'\0\0\0aeabi\0\1\35\0\0\0\0055T\0\6\3\10\1\t\1\22\4\24\1\25\1"..., 40) = 40 
exit_group(1)       = ? 
+++ exited with 1 +++ 
# 

交叉編譯libbost_thread正確安裝在/ lib。

main()被調用之前的程序退出。該程序在我的Ubuntu下正常運行。

目標:ARM與buildroot的(sama5d3)

工具鏈ARM-Linux的gnueabihf-

問候

+0

哇。這是upvoted?什麼是_程序_?!?我的意思是,你顯示的只是它正確加載boost_thread共享庫,然後退出。你期望什麼_停止?爲什麼? – sehe 2015-02-24 13:03:08

+0

嗨,程序應該創建一個線程並打印一個「Hello World」。調用main()之前的程序出口。 – user3068649 2015-02-24 13:44:41

+2

你需要向我們展示_如何讓它這樣做。在這一點上,任何人最好的猜測是PEBCAK(參見[Select Is Not Broken](http://blog.codinghorror.com/the-first-rule-of-programming-its-always-your-fault/)) – sehe 2015-02-24 13:46:10

回答

1

也許作爲一個提示:

你有反對的libpthread與你的目標編譯和鏈接選項-pthread聯繫?

如果不是,它可以與您的環境中看到的效果相同:prog開始,嘗試啓動新線程,未啓用線程並調用abort()函數。因爲abort()只是在退出代碼中將錯誤退出並沒有其他任何事情發生。

您還可以添加您的編譯&鏈接命令爲調試目的請!

此外:

你的輸出而不endl將不被打印,因爲COUT被緩衝。只有在您致電flush或發送endl時纔會打印緩衝區。也許你在你的例子中改變了這個。

希望有幫助...

2

strace是一種工具,跟蹤系統調用。在你的例子中,這包括對open(),lseek()read()的調用。具體來說,您粘貼的片段顯示操作系統的動態庫加載器打開libboost_thread.so.1.55.0文件並讀取其內容;而已。它並沒有真正展示你的程序的任何內容,除非它與該庫鏈接。

+0

我發佈了代碼。任何想法爲什麼在main()被調用之前退出? – user3068649 2015-02-24 14:16:11

+2

沒有明顯的不對稱。嘗試在調試器下運行它。 – 2015-02-24 14:20:32

0

我發現了這個問題。

boost庫是用arm-linux-gnueabi-(elibc)編譯的,而buildroot是用uClibc編譯的。