使用GDB 追踪依赖poco的so程序,core dump文件分析.

 

前言

在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析.

so,linux 系统也有一套这样的东东-->Linux Core Dump

 

Linux Core Dump

  引用 文章 <Linux Core Dump>  http://www.cnblogs.com/hazir/p/linxu_core_dump.html

  的话:

    

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

  其实 <Linux Core Dump>介绍core dump 很详细,唯一缺的就是设置 只能当前有效,重启后失效.

  重启后的设置有所残缺.

 

  这儿就重点说下重启生生效的设置 .

 

为什么在 /proc/sys/kernel/core_pattern,/proc/sys/kernel/core_uses_pid  以及 ulimit -c unlimited 中的设置会失败.

 

关于/proc目录

 

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

/proc 一个虚拟文件系统
 
/proc 文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制(所以叫做/proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中(on the fly) 改变设置(通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。如果你察看文件/proc/mounts (和mount 命令一样列出所有已经加载的文件系统),你会看到其中 一行是这样的:
 
grep proc /proc/mounts
/proc /proc proc rw 0 0
 
/proc 由内核控制,没有承载/proc 的设备。因为/proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对/proc 进行一次'ls -l' 可以看到大部分文件都是0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为/proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层(VFS) 了。然而,直到当VFS 调用它,请求文件、目录的i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。

通过/proc 与内核交互
 
上面讨论的大部分/proc 的文件是只读的。而实际上/proc 文件系统通过/proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。
 
/proc/sys/kernel - 这个目录包含反通用内核行为的信息。/proc/sys/kernel/{domainname, hostname} 存放着机器/网络的域名和主机名。这些文件可以用于修改这些名字。

  注意上面标红的文字

 

永久修改

  ulimit -c filesize #这儿大小是以kb为单位的

  ulimit -c unlimited 

  >改为

  永久设置, 修改/etc/security/limits.conf文件:

  


root@iZ233or8cn2Z:~# cat  /etc/security/limits.conf
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#        - NOTE: group and wildcard limits are not applied to root.
#          To apply a limit to the root user, <domain> must be
#          the literal username root.
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority
#        - chroot - change root to directory (Debian-specific)
#
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#root            hard    core            100
#*               hard    rss             10
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#ftp             -       chroot          /ftp
#@student        -       maxlogins       4

# End of file

root soft core unlimited
root@iZ233or8cn2Z:~# 

  根据上面的意思当设置为

  "* soft core unlimited" 时是对所有用户 生效,然而在debian下没有生效.

  改成"root soft unlimited" 时 root 用户 能生效.这个问题一直没想明白.

在服务器上一直使用,如果有cored ump之后自动拉起的机制,比较容易发生core文件堆满磁盘的情况,需要注意。我采用的是一个进程名只会生效一个dump的办法.

 

core文件的格式和路径: 修改/proc/sys/kernel/core_pattern

echo '%e.core.%p' > /proc/sys/kernel/core_pattern

 

永久设置

/etc/sysctl.conf配置文件

最后添加一行:

kernel.core_pattern = /dump/core-%e

  这样一个进程名,只会有一个dump生产.

  
  core文件是否带pid: 修改/proc/sys/kernel/core_uses_pid

  这个就省掉了,否则后面 dump文件太多...

  

在poco项目中用gdb 测试 core dump 

前面有篇文章<linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记> 

http://www.cnblogs.com/bleachli/p/4363485.html

中有提到过poco项目的编译.

当已经有了so后.

root@iZ233or8cn2Z:~# ls -l /disk1/d1/evn/poco-1.6.0-all/lib/Linux/x86_64/
total 59588
lrwxrwxrwx 1 root root       16 Aug  4 17:02 libCppUnitd.so -> libCppUnitd.so.1
-rwxr-xr-x 1 root root   541402 Aug  4 17:02 libCppUnitd.so.1
lrwxrwxrwx 1 root root       15 Aug  4 17:02 libCppUnit.so -> libCppUnit.so.1
-rwxr-xr-x 1 root root    54992 Aug  4 17:02 libCppUnit.so.1
lrwxrwxrwx 1 root root       18 Aug  4 16:59 libPocoDatad.so -> libPocoDatad.so.30
-rwxr-xr-x 1 root root 15261261 Aug  4 16:59 libPocoDatad.so.30
lrwxrwxrwx 1 root root       17 Aug  4 17:00 libPocoData.so -> libPocoData.so.30
-rwxr-xr-x 1 root root  2678872 Aug  4 17:00 libPocoData.so.30
lrwxrwxrwx 1 root root       24 Aug  4 17:01 libPocoDataSQLited.so -> libPocoDataSQLited.so.30
-rwxr-xr-x 1 root root  4089825 Aug  4 17:01 libPocoDataSQLited.so.30
lrwxrwxrwx 1 root root       23 Aug  4 17:01 libPocoDataSQLite.so -> libPocoDataSQLite.so.30
-rwxr-xr-x 1 root root  1038456 Aug  4 17:01 libPocoDataSQLite.so.30
lrwxrwxrwx 1 root root       24 Aug  4 16:54 libPocoFoundationd.so -> libPocoFoundationd.so.30
-rwxr-xr-x 1 root root 11049923 Aug  4 16:54 libPocoFoundationd.so.30
lrwxrwxrwx 1 root root       23 Aug  4 16:55 libPocoFoundation.so -> libPocoFoundation.so.30
-rwxr-xr-x 1 root root  2017184 Aug  4 16:55 libPocoFoundation.so.30
lrwxrwxrwx 1 root root       18 Aug  4 16:56 libPocoJSONd.so -> libPocoJSONd.so.30
-rwxr-xr-x 1 root root  2529263 Aug  4 16:56 libPocoJSONd.so.30
lrwxrwxrwx 1 root root       17 Aug  4 16:56 libPocoJSON.so -> libPocoJSON.so.30
-rwxr-xr-x 1 root root   323344 Aug  4 16:56 libPocoJSON.so.30
lrwxrwxrwx 1 root root       21 Aug  4 17:01 libPocoMongoDBd.so -> libPocoMongoDBd.so.30
-rwxr-xr-x 1 root root  1526246 Aug  4 17:01 libPocoMongoDBd.so.30
lrwxrwxrwx 1 root root       20 Aug  4 17:01 libPocoMongoDB.so -> libPocoMongoDB.so.30
-rwxr-xr-x 1 root root   168208 Aug  4 17:01 libPocoMongoDB.so.30
lrwxrwxrwx 1 root root       17 Aug  4 16:57 libPocoNetd.so -> libPocoNetd.so.30
-rwxr-xr-x 1 root root  7813242 Aug  4 16:57 libPocoNetd.so.30
lrwxrwxrwx 1 root root       16 Aug  4 16:58 libPocoNet.so -> libPocoNet.so.30
-rwxr-xr-x 1 root root  1200376 Aug  4 16:58 libPocoNet.so.30
lrwxrwxrwx 1 root root       18 Aug  4 16:56 libPocoUtild.so -> libPocoUtild.so.30
-rwxr-xr-x 1 root root  3542 Aug  4 16:56 libPocoUtild.so.30
lrwxrwxrwx 1 root root       17 Aug  4 16:57 libPocoUtil.so -> libPocoUtil.so.30
-rwxr-xr-x 1 root root   480208 Aug  4 16:57 libPocoUtil.so.30
lrwxrwxrwx 1 root root       17 Aug  4 16:55 libPocoXMLd.so -> libPocoXMLd.so.30
-rwxr-xr-x 1 root root  3151822 Aug  4 16:55 libPocoXMLd.so.30
lrwxrwxrwx 1 root root       16 Aug  4 16:56 libPocoXML.so -> libPocoXML.so.30
-rwxr-xr-x 1 root root   592408 Aug  4 16:56 libPocoXML.so.30
lrwxrwxrwx 1 root root       17 Aug  4 17:02 libPocoZipd.so -> libPocoZipd.so.30
-rwxr-xr-x 1 root root  2503316 Aug  4 17:02 libPocoZipd.so.30
lrwxrwxrwx 1 root root       16 Aug  4 17:02 libPocoZip.so -> libPocoZip.so.30
-rwxr-xr-x 1 root root   291688 Aug  4 17:02 libPocoZip.so.30

   

 

测试项目结构如下:

使用GDB 追踪依赖poco的so程序,core dump文件分析.
  

src中是TestTimeServer.cpp

//
// TimeServer.cpp
//
// $Id: //poco/1.4/Net/samples/TimeServer/src/TimeServer.cpp#1 $
//
// This sample demonstrates the TCPServer and ServerSocket classes.
//
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:    BSL-1.0
//


#include "Poco/Net/TCPServer.h"
#include "Poco/Net/TCPServerConnection.h"
#include "Poco/Net/TCPServerConnectionFactory.h"
#include "Poco/Net/TCPServerParams.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/ServerSocket.h"
#include "Poco/Timestamp.h"
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeFormat.h"
#include "Poco/Exception.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include <iostream>


using Poco::Net::ServerSocket;
using Poco::Net::StreamSocket;
using Poco::Net::TCPServerConnection;
using Poco::Net::TCPServerConnectionFactory;
using Poco::Net::TCPServer;
using Poco::Timestamp;
using Poco::DateTimeFormatter;
using Poco::DateTimeFormat;
using Poco::Util::ServerApplication;
using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;


class TimeServerConnection: public TCPServerConnection
    /// This class handles all client connections.
    ///
    /// A string with the current date and time is sent back to the client.
{
public:
    TimeServerConnection(const StreamSocket& s, const std::string& format): 
        TCPServerConnection(s),
        _format(format)
    {
    }
    
    void run()
    {
        Application& app = Application::instance();
        app.logger().information("Request from " + this->socket().peerAddress().toString());
        try
        {
            Timestamp now;
            std::string dt(DateTimeFormatter::format(now, _format));
            dt.append("\r\n");
            socket().sendBytes(dt.data(), (int) dt.length());
        }
        catch (Poco::Exception& exc)
        {
            app.logger().log(exc);
        }
    }
    
private:
    std::string _format;
};


class TimeServerConnectionFactory: public TCPServerConnectionFactory
    /// A factory for TimeServerConnection.
{
public:
    TimeServerConnectionFactory(const std::string& format):
        _format(format)
    {
    }
    
    TCPServerConnection* createConnection(const StreamSocket& socket)
    {
        return new TimeServerConnection(socket, _format);
    }

private:
    std::string _format;
};


class TimeServer: public Poco::Util::ServerApplication
    /// The main application class.
    ///
    /// This class handles command-line arguments and
    /// configuration files.
    /// Start the TimeServer executable with the help
    /// option (/help on Windows, --help on Unix) for
    /// the available command line options.
    ///
    /// To use the sample configuration file (TimeServer.properties),
    /// copy the file to the directory where the TimeServer executable
    /// resides. If you start the debug version of the TimeServer
    /// (TimeServerd[.exe]), you must also create a copy of the configuration
    /// file named TimeServerd.properties. In the configuration file, you
    /// can specify the port on which the server is listening (default
    /// 9911) and the format of the date/time string sent back to the client.
    ///
    /// To test the TimeServer you can use any telnet client (telnet localhost 9911).
{
public:
    TimeServer(): _helpRequested(false)
    {
    }
    
    ~TimeServer()
    {
    }

protected:
    void initialize(Application& self)
    {
        loadConfiguration(); // load default configuration files, if present
        ServerApplication::initialize(self);
    }
        
    void uninitialize()
    {
        ServerApplication::uninitialize();
    }

    void defineOptions(OptionSet& options)
    {
        ServerApplication::defineOptions(options);
        
        options.addOption(
            Option("help", "h", "display help information on command line arguments")
                .required(false)
                .repeatable(false));
    }

    void handleOption(const std::string& name, const std::string& value)
    {
        ServerApplication::handleOption(name, value);

        if (name == "help")
            _helpRequested = true;
    }

    void displayHelp()
    {
        HelpFormatter helpFormatter(options());
        helpFormatter.setCommand(commandName());
        helpFormatter.setUsage("OPTIONS");
        helpFormatter.setHeader("A server application that serves the current date and time.");
        helpFormatter.format(std::cout);
    }

    int main(const std::vector<std::string>& args)
    {
        if (_helpRequested)
        {
            displayHelp();
        }
        else
        {
            //带参数就在 TimeServer::main 中崩溃... 

            int * pTest=NULL;
            *pTest=0x1234;
            // get parameters from configuration file
            unsigned short port = (unsigned short) config().getInt("TimeServer.port", 1234);
            std::string format(config().getString("TimeServer.format", DateTimeFormat::ISO8601_FORMAT));
            
            // set-up a server socket
            ServerSocket svs(port);
            // set-up a TCPServer instance
            TCPServer srv(new TimeServerConnectionFactory(format), svs);
            // start the TCPServer
            srv.start();
            // wait for CTRL-C or kill
            waitForTerminationRequest();
            // Stop the TCPServer
            srv.stop();
        }
        return Application::EXIT_OK;
    }
    
private:
    bool _helpRequested;
};


int main(int argc, char** argv)
{
    if(argc==1)//不带参数就在 main 中崩溃
    {
        int * pTest=NULL;
        *pTest=0x1233;
    }

    TimeServer app;
    return app.run(argc, argv);
}

  注意上面已经说了:

   

if(argc==1)//不带参数就在 main 中崩溃
{
int * pTest=NULL;
*pTest=0x1233;
}

  

//带参数就在 TimeServer::main 中崩溃...

int * pTest=NULL;
*pTest=0x1234;

 

  CMakeList.txt:

  

#定义最低版本.
#cmake_minimum_required(VERSION 3.0.0) 

# 
set(SAMPLE_NAME "TimeServer")

#SET(CMAKE_BUILE_TYPE Debug)        #指定编译类型 设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行 

set(myExeSuffix "")



if (CMAKE_BUILE_TYPE STREQUAL Debug)

    add_definitions(

        -D_DEBUG

    )
    
    add_definitions(-DDEBUG)
    
    add_definitions("$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
    
    set(myExeSuffix "d")
    set(SAMPLE_NAME "TimeServer${myExeSuffix}")
    #SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
    
    MESSAGE(STATUS "my build is debug...")
    
else()
    add_definitions("$ENV{CXXFLAGS} -O3 -Wall")
    #SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
    
    MESSAGE(STATUS "my build is release...")
endif ()

PROJECT(${SAMPLE_NAME})        #定义工程名称




#ADD_SUBDIRECTORY(utility) #添加要编译的子目录 为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。
# 



set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${path_root_dir}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${path_root_dir}/lib)
# Windows DLLs are "runtime" for CMake. Output them to "bin" like the Visual Studio projects do.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "")
#设置程序exe输出位置
SET(EXECUTABLE_OUTPUT_PATH "")

# 
set(LOCAL_SRCS "")

# aux_source_directory 作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来
# 自动构建源文件列表。因为目前cmake还不能自动发现新添加的源文件。
aux_source_directory(src LOCAL_SRCS)

# 生成exe  名字为 ${SAMPLE_NAME} 的值
add_executable(${SAMPLE_NAME}  ${LOCAL_SRCS} )
# 这个指令可以用来为target添加需要链接的共享库
target_link_libraries( ${SAMPLE_NAME}  PocoNet${myExeSuffix} PocoUtil${myExeSuffix} PocoJSON${myExeSuffix} PocoXML${myExeSuffix} PocoFoundation${myExeSuffix}  libmyodbc5a.so)

  

 

在linux 中执行 以release版本生成 

 

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# cmake .
-- my build is release...
-- The C compiler identification is GNU 4.7.2
-- The CXX compiler identification is GNU 4.7.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 3.3)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /disk1/d1/evn/mytest
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# make 
Scanning dependencies of target TimeServer
[ 50%] Building CXX object CMakeFiles/TimeServer.dir/src/TestTimeServer.o
[100%] Linking CXX executable TimeServer
[100%] Built target TimeServer
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# ./TimeServer 
Segmentation fault (core dumped)

  上面(core dumped) 代表已经生成了dump文件.

  

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# ls -lh /dump 


-rw- 1 root root 1.7M Aug  6 12:46 core-TimeServer

  

  使用gdb 进行调试.

  

  

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# gdb ./TimeServer  /mydump/core-TimeServer
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /disk1/d1/evn/mytest/TimeServer...(no debugging symbols found)...done.
[New LWP 7117]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./TimeServer'.
Program terminated with signal 11, Segmentation fault.
#0  0x0403dd9 in main ()
(gdb) where
#0  0x0403dd9 in main ()
(gdb) info share
From                To                  Syms Read   Shared Object Library
0x07f184ce19cb0  0x07f184ce8e83c  Yes (*)     /usr/local/lib/libPocoNet.so.30
0x07f184cb5c9d0  0x07f184cb8a838  Yes (*)     /usr/local/lib/libPocoUtil.so.30
0x07f184c8f88f0  0x07f184c91b9ec  Yes (*)     /usr/local/lib/libPocoJSON.so.30
0x07f184c67fb50  0x07f184c6bc0bc  Yes (*)     /usr/local/lib/libPocoXML.so.30
0x07f184c2fbcd0  0x07f184c3dcc74  Yes (*)     /usr/local/lib/libPocoFoundation.so.30
0x07f184bc8b230  0x07f184bd45c98  Yes         /usr/local/lib/libmyodbc5a.so
0x07f184b99c640  0x07f184ba0071b  Yes (*)     /usr/lib/x86_64-linux-gnu/libstdc++.so.6
0x07f184b6bdef0  0x07f184b6fd6f8  Yes (*)     /lib/x86_64-linux-gnu/libm.so.6
0x07f184b4a6e70  0x07f184b4b65d8  Yes (*)     /lib/x86_64-linux-gnu/libgcc_s.so.1
0x07f184b137b80  0x07f184b24fc2c  Yes (*)     /lib/x86_64-linux-gnu/libc.so.6
0x07f184af02690  0x07f184af0dce8  Yes (*)     /lib/x86_64-linux-gnu/libpthread.so.0
0x07f184acf9de0  0x07f184acfa8f8  Yes (*)     /lib/x86_64-linux-gnu/libdl.so.2
0x07f184aaf3190  0x07f184aaf64f8  Yes (*)     /lib/x86_64-linux-gnu/librt.so.1
0x07f184a8dcdf0  0x07f184a8eb1f4  Yes         /usr/local/lib/libodbcinst.so.2
0x07f184d0c7af0  0x07f184d0dfc83  Yes (*)     /lib64/ld-linux-x86-64.so.2
(*): Shared library is missing debugging information.
(gdb) 

  

  注意上面标红的 "(no debugging symbols found)"  "(*): Shared library is missing debugging information."

  程序没有调试信息..加载的so 也没有调试信息.

  所以我们只能见

  "

(gdb) where
#0 0x0403dd9 in main ()

"

在这儿出错,但具体原因不知.

 

我们再看看进入so 文件内容崩溃的结果呢!

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# ./TimeServer 2
Aborted (core dumped)
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# gdb ./TimeServer  /mydump/core-TimeServer
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /disk1/d1/evn/mytest/TimeServer...(no debugging symbols found)...done.
[New LWP 7787]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./TimeServer 2'.
Program terminated with signal 6, Aborted.
#0  0x07f0c4e389165 in raise () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) where
#0  0x07f0c4e389165 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x07f0c4e38c3e0 in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x07f0c4f5a8da5 in Poco::SignalHandler::handleSignal(int) () from /usr/local/lib/libPocoFoundation.so.30
#3  <signal handler called>
#4  0x0403e58 in TimeServer::main(std::vector<std::string, std::allocator<std::string> > const&) ()
#5  0x07f0c4fda6407 in Poco::Util::Application::run() () from /usr/local/lib/libPocoUtil.so.30
#6  0x0403dbd in main ()
(gdb) 

  还是没有找到具体原因.

 

在linux 中以debug版本生成 

 

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# cmake -DCMAKE_BUILE_TYPE=Debug  .
-- my build is debug...
-- The C compiler identification is GNU 4.7.2
-- The CXX compiler identification is GNU 4.7.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 3.3)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /disk1/d1/evn/mytest
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# make 
Scanning dependencies of target TimeServerd
[ 50%] Building CXX object CMakeFiles/TimeServerd.dir/src/TestTimeServer.o
[100%] Linking CXX executable TimeServerd
[100%] Built target TimeServerd
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  Makefile  src  TimeServerd  TimeServer.progen  TimeServer.properties
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# ./TimeServerd 
Segmentation fault (core dumped)

  使用gdb查看

 

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# gdb ./TimeServerd  /mydump/core-TimeServerd
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /disk1/d1/evn/mytest/TimeServerd...done.
[New LWP 8398]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./TimeServerd'.
Program terminated with signal 11, Segmentation fault.
#0  0x0404aca in main (argc=1, argv=0x7fff018b4c98) at /disk1/d1/evn/mytest/src/TestTimeServer.cpp:207
207                     *pTest=0x1233;
(gdb) info share
From                To                  Syms Read   Shared Object Library
0x07fa8ef6c5  0x07fa8ef75213c  Yes         /usr/local/lib/libPocoNetd.so.30
0x07fa8ef381680  0x07fa8ef3bc2d4  Yes         /usr/local/lib/libPocoUtild.so.30
0x07fa8ef0bf260  0x07fa8ef0ee748  Yes         /usr/local/lib/libPocoJSONd.so.30
0x07fa8eedec140  0x07fa8eee43ff8  Yes         /usr/local/lib/libPocoXMLd.so.30
0x07fa8ee9c5750  0x07fa8eeaed290  Yes         /usr/local/lib/libPocoFoundationd.so.30
0x07fa8ee297230  0x07fa8ee351c98  Yes         /usr/local/lib/libmyodbc5a.so
0x07fa8edfa8640  0x07fa8ee00c71b  Yes (*)     /usr/lib/x86_64-linux-gnu/libstdc++.so.6
0x07fa8edcc9ef0  0x07fa8edd096f8  Yes (*)     /lib/x86_64-linux-gnu/libm.so.6
0x07fa8edab2e70  0x07fa8edac25d8  Yes (*)     /lib/x86_64-linux-gnu/libgcc_s.so.1
0x07fa8ed743b80  0x07fa8ed85bc2c  Yes (*)     /lib/x86_64-linux-gnu/libc.so.6
0x07fa8ed50e690  0x07fa8ed519ce8  Yes (*)     /lib/x86_64-linux-gnu/libpthread.so.0
0x07fa8ed305de0  0x07fa8ed3068f8  Yes (*)     /lib/x86_64-linux-gnu/libdl.so.2
0x07fa8ed0ff190  0x07fa8ed1024f8  Yes (*)     /lib/x86_64-linux-gnu/librt.so.1
0x07fa8ecee8df0  0x07fa8ecef71f4  Yes         /usr/local/lib/libodbcinst.so.2
0x07fa8ef9a9af0  0x07fa8ef9c1c83  Yes (*)     /lib64/ld-linux-x86-64.so.2
(*): Shared library is missing debugging information.
(gdb) where
#0  0x0404aca in main (argc=1, argv=0x7fff018b4c98) at /disk1/d1/evn/mytest/src/TestTimeServer.cpp:207
(gdb) 

  看上面  poco 的so文件也参加载调试信息了.

  "(no debugging symbols found)"  "(*): Shared library is missing debugging information."

  这两个错误已经不见了.

 

使用GDB 追踪依赖poco的so程序,core dump文件分析.

  这个错误定位已直观了.

 

  再看看so中的错误呢

 

root@iZ233or8cn2Z:/disk1/d1/evn/mytest# ./TimeServerd 22 2
Segmentation fault (core dumped)
root@iZ233or8cn2Z:/disk1/d1/evn/mytest# gdb ./TimeServerd  /mydump/core-TimeServerd
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /disk1/d1/evn/mytest/TimeServerd...done.
[New LWP 11949]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./TimeServerd 22 2'.
Program terminated with signal 11, Segmentation fault.
#0  0x040588e in TimeServer::main (this=0x7ffed2e55cb0, args=...) at /disk1/d1/evn/mytest/src/TestTimeServer.cpp:178
178                             *pTest=0x1234;
(gdb) where
#0  0x040588e in TimeServer::main (this=0x7ffed2e55cb0, args=...) at /disk1/d1/evn/mytest/src/TestTimeServer.cpp:178
#1  0x07f0212ccf02d in Poco::Util::Application::run (this=0x7ffed2e55cb0) at src/Application.cpp:329
#2  0x07f0212ceb49c in Poco::Util::ServerApplication::run (this=0x7ffed2e55cb0) at src/ServerApplication.cpp:97
#3  0x07f0212ceb5ea in Poco::Util::ServerApplication::run (this=0x7ffed2e55cb0, argc=3, argv=0x7ffed2e55e68) at src/ServerApplication.cpp:612
#4  0x0404afd in main (argc=3, argv=0x7ffed2e55e68) at /disk1/d1/evn/mytest/src/TestTimeServer.cpp:211
(gdb) 

  使用GDB 追踪依赖poco的so程序,core dump文件分析.

  已经能直观的找到我们的错误了.

  在linux 这种服务程序的开发中,有了日志输出+core dump 对于一般的程序员来方可以节省很多查找错误的时间.

 

关于cmake 

  cmake 虽然简单.但命令也是比较多的.

  以下两个文章供参考:

  http://blog.csdn.net/dbzhang800/article/details/6314073

  http://www.cnblogs.com/lidabo/p/3974305.html

  http://www.hahack.com/codes/cmake/

 

 
更多相关文章
  • 进入2011年,国内外IT巨头加速了对云计算市场的跑马圈地,包括IBM.惠普.甲骨文.SAP.用友.华为.思科等,大打"云"牌.日前,惠普宣布将砸下20亿美元投资云计算,这是惠普6月份在全球发布"瞬捷"云计算战略和中国云计算战略之后,在云计算方面的又一大投资. ...
  • 在平时运维工作中有时候需要根据不同的远程节点或者针对不同的IP的系统做不同的配置部署.如,Ansible可以根据不同的IP地址来对各个节点上的配置文件做不同的处理,这里就需要用到变量. 可以在playbooks文件中直接定义变量: - hosts: webservers vars: http_por ...
  •   SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要.这要如何达成呢?在 SQL 中,这是很容易做 ...
  • 易网创业Club是易网科技中心推出的服务于创业公司.行业人才.风险投资机构和科技媒体的综合性服务平台.易网科技创业Club聚集了数百位优质创业CEO,下面是关于这位CEO和他的公司的介绍.郭宇介绍
  • 引言 EntityFramework 6 作为微软的开源ORM框架,有着得天独厚的优势.微软也在MVC中主推EF做为ORM框架.但是在实际的项目开发中我们总是感觉到EF有些慢,或者有这样那样的问题.但实际上有时是因为我们滥用导致了问题的出现.本章就像对EF的性能优化方面的内容做个抛砖引玉,希望能给大 ...
  • 一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程序代码: public class  ...
一周排行
  • function fn1(){ //创建了一个数组 var fns = new Array(); //i这个变量是保存在fn1这个作用域中 for(var i=0;i
  • 以下的文章主要向大家介绍的是蠕虫程序劫持用户搜索引擎来获取推广利益,互联网的盈利模式中最传统的就是广告收入,一般的情况下站长都会在做好自已的网站之后,在投放百度.GOOGLE.阿里妈妈等广告,基本上一个点击是几毛钱至 ...
  • 刚刚经历过“双十一”网购的狂欢后,余温还未散去,紧接着各大电商又开始了“双十二”的大肆宣传造势.今天是年中最后一次网购盛宴.作为一种全新的购物方式,网络购物正吸引着越来越多的消费者,但记者从中国反钓鱼网站联盟(以下简 ...
  • 以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4389674.html   需求:在ActivityA跳转到ActivityB, ...
  • Blob的概念: Blob是一种为存储二进制数据提供的存储机制,每个Storage Account可以有多个Container,Container中可以存放二进制文件 可以通过REST API来访问,如下: http ...
  • 标 题: intel指令格式与长度反汇编引擎ADE32分析 作 者: 火影 时 间: 1,1 链 接: http://bbs.pediy.com/showthread.php?t=54180 ...
  • 百度地图获取的经纬度是 0..0,不能获取自己位置经纬度. 原来是在application中少配置了服务: 在application中 添加application 那么: <application and ...
  • 原文:http://www.ruanyifeng.com/blog/2011/07/dont_compete_on_features.html苹果公司的电子产品,最大的特点就是它的易用性(usability)---- ...
  •    最近在学PHP,一位朋友问到时间的计算,此时我想到了delphi和mssql的计算函数,它们用起来都很方便,但查查php手册并未发现类似的时间计算函数,通过网文的启发和自已的测试,还是找到简单的方法来实现,具体 ...
  • Common Problems Verifying Server Certificates InputStream in = urlConnection.getInputStream(); getInputStrea ...