如何解释 strace 输出
How to interpret the strace output
当我在我的嵌入式 Linux 上执行以下程序时,没有任何反应:
#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, "7ELF[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]([=11=][=11=][=11=][=11=]02[=11=][=11=]04[=11=][=11=][=11=]"..., 512) = 512
lseek(3, 95536, SEEK_SET) = 95536
read(3, "[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]"..., 1200) = 1200
lseek(3, 95226, SEEK_SET) = 95226
read(3, "A'[=11=][=11=][=11=]aeabi[=11=][=11=][=11=][=11=][=11=]55T[=11=]\t"..., 40) = 40
exit_group(1) = ?
+++ exited with 1 +++
#
交叉编译的libbost_thread正确安装在/lib.
程序在调用 main() 之前退出。程序在我的Ubuntu.
下运行正常
目标:ARM with buildroot (sama5d3)
工具链:arm-linux-gnueabihf-
此致
strace
是一个跟踪系统调用的工具。在您的示例中,这包括对 open()
、lseek()
和 read()
的调用。具体来说,您粘贴的片段显示 OS 的动态库加载程序打开 libboost_thread.so.1.55.0
文件并读取其内容;而已。除了链接到该库之外,它并没有真正展示有关您的程序的任何内容。
也许作为提示:
您是否针对目标 link 使用编译和 link 选项 -pthread
针对 libpthread?
如果不是,它可能会产生与在您的环境中看到的相同的效果:prog 启动,尝试启动一个新线程,不启用线程并调用 abort() 函数。因为 abort() 只是让 prog 在退出代码中留下错误,所以没有其他事情发生。
您能否也添加编译和 link 命令用于调试目的!
另外:
没有 endl
的输出将不会被打印,因为 cout 被缓冲了。仅当您调用 flush
或发送 endl
时才会打印缓冲区。也许你在你的例子中改变了这个。
希望对您有所帮助...
我发现了问题。
boost库是用arm-linux-gnueabi- (elibc)编译的,buildroot是用uClibc编译的。
当我在我的嵌入式 Linux 上执行以下程序时,没有任何反应:
#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, "7ELF[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]([=11=][=11=][=11=][=11=]02[=11=][=11=]04[=11=][=11=][=11=]"..., 512) = 512
lseek(3, 95536, SEEK_SET) = 95536
read(3, "[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]"..., 1200) = 1200
lseek(3, 95226, SEEK_SET) = 95226
read(3, "A'[=11=][=11=][=11=]aeabi[=11=][=11=][=11=][=11=][=11=]55T[=11=]\t"..., 40) = 40
exit_group(1) = ?
+++ exited with 1 +++
#
交叉编译的libbost_thread正确安装在/lib.
程序在调用 main() 之前退出。程序在我的Ubuntu.
下运行正常目标:ARM with buildroot (sama5d3)
工具链:arm-linux-gnueabihf-
此致
strace
是一个跟踪系统调用的工具。在您的示例中,这包括对 open()
、lseek()
和 read()
的调用。具体来说,您粘贴的片段显示 OS 的动态库加载程序打开 libboost_thread.so.1.55.0
文件并读取其内容;而已。除了链接到该库之外,它并没有真正展示有关您的程序的任何内容。
也许作为提示:
您是否针对目标 link 使用编译和 link 选项 -pthread
针对 libpthread?
如果不是,它可能会产生与在您的环境中看到的相同的效果:prog 启动,尝试启动一个新线程,不启用线程并调用 abort() 函数。因为 abort() 只是让 prog 在退出代码中留下错误,所以没有其他事情发生。
您能否也添加编译和 link 命令用于调试目的!
另外:
没有 endl
的输出将不会被打印,因为 cout 被缓冲了。仅当您调用 flush
或发送 endl
时才会打印缓冲区。也许你在你的例子中改变了这个。
希望对您有所帮助...
我发现了问题。
boost库是用arm-linux-gnueabi- (elibc)编译的,buildroot是用uClibc编译的。