Teamcenter 在 suse linux上调试

时间:2021-12

作者:李云

事由:近期某项目上的ITK程序,在虚拟机Windows环境下通过了测试,但在客户Linux测试环境下却崩溃了,故不得不寻找一个在Linux下调试ITK程序的方法,特记以此文。

 

环境:SUSE Linux Server 12 + Teamcenter 13.1 + GCC 4.8.5 + GDB 8.0.1

 

经过:

  1. 将写好的ITK程序复制到SUSE Linux系统中,使用make命令进行编译:

     

     

    a) 必须使用合适的Linux用户来进行编译,否则编译完成后的文件,可能需要修改用户权限。这里使用的是Teamcenter软件专用的infodba用户;

    b) 需要切换到makefile所在目录下执行make命令,否则可能会提示没有makefile文件,或者需要手动指定makefile全路径;

    当前使用的makefile文件中,编译选项必须含有-g,否则编译好的.so文件中将不包含调试信息:

  2.  

     

  3. 当前使用的makefile文件内容:

  4. SITE = libZL13

    TC_ROOT = /usr/Siemens/Teamcenter13

     

    DEBUG = -g

    USER_INCLUDE = -I.

    USER_LIB =

     

    CC = gcc

    LD = gcc

     

    SRCS = $(wildcard *.c)

    OBJS = $(patsubst %c, %o, $(SRCS))

     

    DEFINES=-c -fPIC -m64 -DPOSIX -DIPLIB -DNO_DOT_H -DSITE=${SITE}

    # -I指定头文件目录

    INCLUDES = ${USER_INCLUDE} -I${TC_ROOT}/include -I${TC_ROOT}/include_cpp

    # -L指定库文件目录,-l指定静态库名字(去掉文件名中的lib前缀和.a后缀)

    LIBS = ${USER_LIB} -L${TC_ROOT}/lib -ltc

     

    CFLAGS = ${DEFINES} ${INCLUDES} ${DEBUG} -c

     

    TARGET = ${SITE}.so

     

    .PHONY:all clean

     

    all: $(TARGET)

    # 链接时候指定库文件目录及库文件名

    $(TARGET): $(OBJS)

    $(LD) -shared -o $@ $^ $(LIBS)

     

    # 编译时候指定头文件目录

    %.o:%.c

    $(CC) $(CFLAGS) $^

     

    clean:

    rm -f $(OBJS) $(TARGET)

     

  5. 将编译好的.so文件复制到ITK程序所在目录:
  6.  

    a) 此处直接使用命令进行复制:
    sudo cp ./libZL13.so /usr/Siemens/Teamcenter13/lib/

      1. 使用ps命令查看系统中的tcserver进程,记住当前的列表:
  7.  

     

  8. a) 命令:
    ps -ef|grep tcserver

      1. 启动Teamcenter胖客户端,并登录:、

         

         

         

        1. 登录完成后,再次使用ps命令查看tcserver进程,找到新增的线程ID:
        2.  

           

          1. 启动GDB工具(由于SUSE默认安全要求,这里必须用sudo,否则可能会没有操作权限),附加到新增的tcserver进程(此处进程ID9097):
          2.  

             

          3. a) 命令:
            sudo gdb libZL13.so 9097

            b) 也可以先直接使用命令sudo gdb进入gdb调试环境,然后再使用gdb内部的命令attach 9097附加到9097进程(如果碰到不能打断点的问题,可以使用这种方法)

             

            1. 尝试列出需要调试的ITK函数,用以验证调试信息是否正常加载:
          4.  

             

          5. a) GDB命令:
            list cust_check_property_by_value

            1. 设置断点,这里设置为一进入函数就中断:
            2.  

               

              a) GDB命令:
              break cust_check_property_by_value

              b) GDB命令:
              continue

              1. 流程准备:在流程中加入handler,然后启动流程:
              2.  

                 

                1. 当命中断点时,gdb中会给出提示(如果没有提示,胖客户端也卡住了,尝试在gdb中使用continue命令):
                2.  

                   

         

         

        常用gdb命令(在提示符下直接敲回车表示重复上一条命令):

      2. backtrace(或bt)        查看各级函数调用及参数

        finish                     连续运行到当前函数返回为止,然后停下来等待命令

        frame(或f) 帧编号         选择栈帧

        info(或i) locals             查看当前栈帧局部变量的值

        list(或l)                 列出源代码,接着上次位置往下列,每次列10行

        list 行号                     列出从第几行开始的源代码

        list 函数名                 列出某个函数的源代码

        next(或n)                 执行下一行语句

        print(或p)                 打印表达式的值,通过表达式可以修改变量的值或者调用函数

        quit(或q)                 退出gdb调试环境

        set var                     修改变量的值

        start                         开始执行程序,停在main函数第一行语句前面等待命令

        step(或s)                 执行下一行语句,若有函数调用则进入函数中

        break(或b) 行号         在某一行设置断点

        break 函数名                 在某个函数开头设置断点

        break ... if ...                 设置条件断点

        continue(或c)             从当前位置开始连续运行程序

        delete breakpoints 断点号     删除断点

        display 变量名             跟踪查看某个变量,每次停下来都显示它的值

        disable breakpoints   断点号 禁用断点

        enable 断点号             启用断点

        info(或i) breakpoints     查看当前设置了哪些断点

        run(或r)                 从头开始连续运行程序

        undisplay 跟踪显示号         取消跟踪显示

     

     

 

posted @   张永全-PLM顾问  阅读(334)  评论(2编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
点击右上角即可分享
微信分享提示