在 Linux* 主机上调试英特尔® 至强融核™ 应用

目录

简介

英特尔® 至强融核™ 协处理器是一款基于英特尔® 众核架构(英特尔® MIC)的产品。 英特尔® 为该架构提供了调试解决方案,其可调试英特尔® 至强融核™ 协处理器上运行的应用。

英特尔 ® MIC 需要一款调试解决方案出于多种原因。 以下介绍了其中一些主要原因:

  • 开发本地英特尔® MIC 应用与在 IA-32 或英特尔® 64 主机上开发应用一样简单。 在大部分情况下,仅需对其进行交叉编译(-mmic)。
    但是,英特尔® MIC 架构不同于主机架构。 这些区别可以揭示目前的区别。 此外,对英特尔® MIC 调试不当可能会带来新的问题(如数据对齐,一款应用能否处理数百个以上线程?有效的内存消耗?等。)
  • 开发支持卸载的应用将会带来更多复杂性,因为主机和协处理器在共享工作负载。
  • 一般的低级别分析,追踪执行路径,了解英特尔® MIC 架构的指令集...

面向英特尔® MIC 的调试解决方案

对于 Linux* 主机,英特尔可提供面向英特尔® MIC 的调试解决方案,该方案基于 GNU* GDB。 它可用在主机和协处理器的命令行上。 此外,还有一款 Eclipse* IDE 集成,可帮助调试包括数百个线程的应用 — 这得益于其用户界面。 而且,它还可为支持调试卸载的应用提供支持。

如何获得?

目前,有两种方式获取面向基于 Linux* 主机的英特尔® MIC 架构的英特尔调试解决方案:

两种软件包包括相同的面向英特尔® MIC 架构的调试解决方案!

注:
英特尔® Composer XE 2013 SP1 包含 GNU* GDB 7.5。 在之后的版本中,包含了 GNU* GDB 7.7。 但是,目前所有 MPSS 版本中仅包含版本 7.5。

为何使用英特尔提供的 GNU* GDB?

  • 新特性/改进将在 GNU* 社区中发布
  • 最新的 GNU* GDB 版本将在未来版本中发布
  • 由于 Project Archer 和英特尔的贡献,C/C++ & Fortran 支持得到了改进
  • 面向英特尔® 架构(尤其 英特尔 ® MIC)的改进支持
  • 其他调试功能 — 未来将提供更多内容

最新的英特尔相关硬件支持和特性将由英特尔在调试解决方案中提供!

英特尔为何提供命令行与 Eclipse* IDE 的集成?

GNU* GDB 命令行具备以下优势:

  • 众所周知的语法
  • 轻量型:无依赖性
  • 轻松安装:无需创建项目
  • 能够快速调试数百个线程
  • 能够进行定制/脚本编写

使用 Eclipse* IDE 可提供更多特性:

  • 舒适的用户界面
  • Linux* 空间中大部分的已知 IDE
  • 使用现有的 Eclipse* 项目
  • 与英特尔增强的 GNU* GDB 简单集成
  • 还可配合 Photran* 插件使用,从而支持 Fortran
  • 支持调试支持卸载的应用
    (命令行不提供该支持)

停用声明

英特尔® 调试器将停用(包括英特尔® MIC 架构支持):

  • 面向英特尔® MIC 架构的英特尔® 调试器将仅支持 Composer XE 2013 和 2013 SP1
  • 英特尔® 调试器将不再是英特尔® Composer XE 2015 的一部分

建议用户使用英特尔® Composer XE 2013 SP1 和更高版本随附的 GNU* GDB。

您可以通过自己的英特尔® 高级账户(http://premier.intel.com/)或通过调试解决方案用户论坛(http://software.intel.com/en-us/forums/debug-solutions/)提供反馈。

特性

自 7.5 版起,英特尔 GNU* GDB 将提供额外的扩展,该扩展可在命令行中使用:

  • 支持英特尔® 集成众核架构(英特尔® MIC 架构):
    显示寄存器 (zmmX & kX) 和反汇编指令集
  • 支持英特尔® 事务性同步扩展(英特尔® TSX):
    限制事务性内存(RTM)型号助手
    (仅适用于主机)
  • 数据竞跑检测 (pdbx)
    检测并定位使用 POSIX* 线程 (pthread) 或 OpenMP* 模型进行编程的应用的数据竞跑
  • 分支跟踪存储 (btrace):
    记录执行流程中的分支,以便在出现类似崩溃、信号、异常等事件后轻松回溯
    (仅适用于主机)
  • 指针检测器:
    帮助查找使用英特尔® C++ 编译器进行编译的程序中的指针问题,并帮助启用指针检测器功能
    (仅适用于主机)
  • 面向英特尔® 内存保护扩展(英特尔® MPX)和英特尔® 高级矢量扩展指令集 512 (英特尔® AVX-512)的寄存器支持:
    调试器可用于未来的产品

上述重点提出的面向英特尔® MIC 特性将会在下文进行介绍。

寄存器和指令集支持

与主机系统上的英特尔® 架构相比,英特尔® MIC 架构配备了多种指令和寄存器集。 英特尔 GNU* GDB 可提供针对其的透明集成支持。  其使用与主机系统相同,如:

  • 反汇编指令:
    
    		(gdb) disassemble $pc, +10
    
    		Dump of assembler code from 0x11 to 0x24:
    
    		0x0000000000000011 <foobar+17>: vpackstorelps %zmm0,-0x10(%rbp){%k1}
    
    		0x0000000000000018 <foobar+24>: vbroadcastss -0x10(%rbp),%zmm0
    
    		⁞
    
    		


    在上述示例中,前十个指令从指令指针 ($pc) 开始进行反汇编。 为简便起见,仅显示了前两行。 前两个指令专门针对英特尔® MIC 及其助记符。
  • 屏蔽 (kX) 和矢量 (zmmX) 寄存器列表:
    
    		(gdb) info registers zmm
    
    		k0   0x0  0
    
    		     ⁞
    
    		zmm31 {v16_float = {0x0 <repeats 16 times>},
    
    		      v8_double = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    
    		      v64_int8 = {0x0 <repeats 64 times>},
    
    		      v32_int16 = {0x0 <repeats 32 times>},
    
    		      v16_int32 = {0x0 <repeats 16 times>},
    
    		      v8_int64 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
    
    		      v4_uint128 = {0x0, 0x0, 0x0, 0x0}}
    
    		

    此外,已使用英特尔® MIC 随附的 kX (屏蔽)和 zmmX (矢量)对寄存器进行了扩展。

如果您使用的是 Eclipse* IDE 集成,将会在专用窗口中获得相同的信息:

  • 反汇编指令:
    Eclipse* IDE Disassembly Window
  • 屏蔽 (kX) 和矢量 (zmmX) 寄存器列表:
    Eclipse* IDE Register Window

数据竞跑检测

关于数据竞跑的题外话:

  • 如果至少有两个线程/任务同步/异步访问相同的内存位置,且至少有一个线程/任务在编写,将会发生数据竞跑...
  • 示例:
    假定两个函数 thread1()thread2() 同时被不同的线程执行。

    
    		int a = 1;
    
    		int b = 2;
    
    		                                         | t
    
    		int thread1() {      int thread2() {     | i
    
    		  return a + b;        b = 42;           | m
    
    		}                    }                   | e
    
    		                                         v
    
    		


    根据时间返回 thread1() 的值: 3 vs. 43 !
    这是数据竞跑的示例(trivial)。

数据竞跑的典型现象有哪些?

  • 数据竞跑症状:
    • 结果损坏
    • 每个批次的变量
    • 损坏数据崩溃
    • 运行状况不确定
  • 解决办法是同步并发访问,如:
    • 线程级别定序(全局同步)
    • 指令级别定序/可见性(原子)
      注:
      自由争夺,但每个批次不必是相同的结果!
    • 无同步:数据竞跑可接受

GDB 数据竞跑检测可指出不同步的数据访问。 并非所有不同步的数据访问都会导致出现数据竞跑。 用户需要决定不需要哪些并将其过滤(见下文)。
由于技术限制,并非所有的不同步数据访问都能找到,如: 第三方库或任何未使用 –debug parallel 进行编译的对象代码(见下文)。

如何检测数据竞跑?

  • 数据竞跑检测准备:
    • 仅支持在英特尔® C++/Fortran 编译器(英特尔® Composer XE 的组件)上使用:
      使用 -debug parallel(icc、icpc 或 ifort)
      只有使用 -debug parallel进行编译的对象才能进行分析!
    • 或者,可以通过-g添加调试信息
  • 支持在调试器中使用数据竞跑检测(PDBX)
    
    		(gdb) pdbx enable
    
    		(gdb) c
    
    		data race detected
    
    		1: write shared, 4 bytes from foo.c:36
    
    		3: read shared, 4 bytes from foo.c:40
    
    		Breakpoint -11, 0x401515 in L_test_..._21 () at foo.c:36
    
    		*var = 42; /* bp.write */
    
    		

数据竞跑检测需要另外一个库 libpdbx.so.5:

  • 追踪同步
  • 英特尔® C++ & Fortran 编译器的组件
  • 如果丢失,将复制至协处理器
    (位于 <composer_xe_root>/compiler/lib/mic/libpdbx.so)

支持的并行编程模型:

  • OpenMP*
  • POSIX* 线程

数据竞跑检测可随时启用/禁用

  • 只有内存访问只能在特定时段内进行分析
  • 可最大限度地降低内存空间和运行时开销

能够更精细地控制开销的降低和代码段的选择,以便通过使用过滤器集进行分析。

关于使用过滤器进行分析的其他控制:

  • 将过滤器添加至选择的过滤器集,如
    
    		(gdb) pdbx filter line foo.c:36
    
    		(gdb) pdbx filter code 0x40518..0x40524
    
    		(gdb) pdbx filter var shared
    
    		(gdb) pdbx filter data 0x60f48..0x60f50
    
    		(gdb) pdbx filter reads # read accesses
    
    		

    它们能够分别使用符号名或地址(范围)来指定源文件和行、地址(范围)或变量,从而在任意指令中定义各种过滤器。 此外,还有一个过滤器专门报告使用(读取)数据的存取情况,以防出现数据竞跑。
     
  • 有两个基本配置,包括:
    • 忽略过滤器指定的事件(默认运行状况)

      
      					(gdb) pdbx fset suppress
      
      					

    • 忽略过滤器没有指定的事件

      
      					(gdb) pdbx fset focus
      
      					

      第一个配置可以定义白名单,第二个可以将不需要分析的代码或数据段列入黑名单。

  • 获取调试命令帮助
    
    		(gdb) help pdbx
    
    		

    该命令将在命令中提供其他帮助。

过滤器使用案例:

  • 集中调试,如调试单来源文件或仅调试一个特定内存位置。
  • 限制开支并控制误报。 检测包括运行时和运行时的内存开支。 过滤器对分析范围的限制越明确,开支便越少。 这还可用于排除误报。 如果实际检测到数据竞跑,但是从设计上对应用的正确性没有任何影响(如多线程结果无需以严格的顺序进行全局存储),将会导致出现误报。
  • 排除第三方代码,以便进行分析

 

使用 PDBX 的其他提示:

 

  • 优化的代码(症状):
    
    		(gdb) run
    
    		data race detected
    
    		1: write question, 4 bytes from foo.c:36
    
    		3: read question, 4 bytes from foo.c:40
    
    		Breakpoint -11, 0x401515 in foo () at foo.c:36
    
    		*answer = 42;
    
    		(gdb)
    
    		
  • 事故进须进一步分析:
    • 请记住:仅报告内存对象的数据竞跑
    • 如果符号名无法解决:仅打印地址
       
  • 建议:
    未经优化的代码 (-O0) 更易于理解,因为一些临时变量等被删除/或优化掉。
     
  • 报告的数据竞跑似乎是误报:
    • 并非所有的数据竞跑都是不好的...用户有意为之?
    • OpenMP*: 不同的并行段使用相同的变量(相同的堆栈帧)可能导致误报

注:
PDBX 不支持在 Eclipse* IDE 上使用,仅可用于对本地协处理器应用进行远程调试。 参阅使用 PDBX 远程调试部分的内容,了解具体如何使用它。

在命令行上调试

有多个版本可用:

  • 在英特尔® 至强融核™ 协处理器上进行本地调试
  • 在主机上运行 GNU* GDB 并进行远程调试

在英特尔® 至强融核™ 协处理器上进行本地调试
本版本的英特尔 GNU* GDB 可在协处理器上本地运行。 它仅在英特尔® MPSS 中提供,并需要先在协处理器上启用才可运行。 您可根据 MPSS 版本在提供的位置处找到:

  • MPSS 2.1: /usr/linux-k1om-4.7/linux-k1om/usr/bin/gdb
  • MPSS 3.*:包含在 gdb-7.*+mpss3.*.k1om.rpm 中,是 mpss-3.*-k1om.tar
    软件包的一部分 (对于 MPSS 3.1.2,请参阅勘误,对于 PSS 3.1.4,请使用 mpss-3.1.4-k1om-gdb.tar)

    对于 MPSS 3.* ,协处理器本地 GNU* GDB 需要某些系统库的调试信息才可正常操作。 请参阅勘误,了解更多信息。

在主机上执行 GNU* GDB 并进行远程调试
有两种方式可以在主机上启动 GNU* GDB 并使用协处理器上的 DBServer 进行远程调试:

  • 英特尔® MPSS:
    • MPSS 2.1: /usr/linux-k1om-4.7/bin/x86_64-k1om-linux-gdb
    • MPSS 3.*: <mpss_root>/sysroots/x86_64-mpsssdk-linux/usr/bin/k1om-mpss-linux/k1om-mpss-linux-gdb
    • GDBServer:
      /usr/linux-k1om-4.7/linux-k1om/usr/bin/gdbserver
      (对于 MPSS 2.1 & 3.*,是相同的路径)
  • 英特尔® Composer XE:
    • 启动 GNU* GDB 的源环境:
      
      				$ source debuggervars.[sh|csh]
      
      				$ gdb-mic
      
      				
    • GDBServer:
      <composer_xe_root>/debugger/gdb/target/mic/bin/gdbserver

调试器环境的源仅需一次。 如果您已经找到与 compilervars.[sh|csh] 一致的脚本,则可忽略该步骤,gdb-mic 应该已经在您的默认搜索路径中。

注意: 请勿将 GNU* GDB & GDBServer 与其他数据包混合放置! 务必使用英特尔® MPSS 或 Intel® Composer XE 中的组件!

本地调试

  1. 确保已经通过以下指令在目标上启用了 GNU* GDB:
  • 手动复制,如:
    
    		$ scp /usr/linux-k1om-4.7/linux-k1om/usr/bin/gdb mic0:/tmp
    
    		
  • 添加至协处理器映像(参阅英特尔® MPSS 文档)
  1. 在英特尔® 至强融核™ 协处理器上运行 GNU* GDB,如:
    
    		$ ssh –t mic0 /tmp/gdb
    
    		
  2. 启动调试会话,如:
  • 添加:
    
    		(gdb) attach <pid>
    
    		

    <pid> 是协处理器上的 PID
  • 加载和执行:
    
    		(gdb) file <path_to_application>
    
    		

    <path_to_application> 是协处理器上的路径

其他说明:

  • 如果本地应用需要其他库:
    通过以下命令(或其他)对 $LD_LIBRARY_PATH 进行设置:
    
    		(gdb) set env LD_LIBRARY_PATH=/tmp/
    
    		

    或在启动 GDB 前设置变量

  • 如果重新定位到源代码,请帮调试器找到它:
    
    		(gdb) set substitute-path <from> <to>
    
    		

    将路径从 <from> 更改为 <to>。 您可以用它来重新定位整个源代码(子代码)树。

    由于协处理器上的 Linux* 环境为真实环境,所以调试与在主机上相同!

远程调试

  1. 将 GDBServer 复制至协处理器,如:
    
    		$ scp <composer_xe_root>/debugger/gdb/target/mic/bin/gdbserver mic0:/tmp
    
    		

    在开发过程中,您也可以将 GDBServer 添加至您的协处理器映像!
  2. 在主机上启动 GDB,如:
    
    		$ source debuggervars.[sh|csh]
    
    		$ gdb-mic
    
    		


    注:
    此外,还有一个名为 gdb-ia 的版本,该版本仅面向 IA-32/英特尔 64!
  3. 连接
    
    		(gdb) target extended-remote | ssh -T mic0 /tmp/gdbserver --multi –
    
    		

     
  4. 从 MPSS 安装设置 sysroot ,如:
    
    		(gdb) set sysroot /opt/mpss/3.1.4/sysroots/k1om-mpss-linux/
    
    		

    如果不指定它,则无法获得针对系统库的调试器支持。
  5. 调试:
  • 添加:
    
    		(gdb) file <path_to_application>
    
    		(gdb) attach <pid>
    
    		

    <path_to_application> 是主机上的路径,<pid> 是协处理器上的 PID
  • 加载和执行:
    
    		(gdb) file <path_to_application>
    
    		(gdb) set remote exec-file <remote_path_to_application>
    
    		

    <path_to_application> 是主机上的路径,<remote_path_to_application> 是协处理器上的路径

其他说明:

  • 如果远程应用需要其他库:
    通过以下命令(或其他)对 $LD_LIBRARY_PATH 进行设置:
    
    		(gdb) target extended-remote | ssh mic0 LD_LIBRARY_PATH=/tmp/ /tmp/gdbserver --multi -
    
    		
  • 如果重新定位到源代码,请帮调试器找到它:
    
    		(gdb) set substitute-path <from> <to>
    
    		

    将路径从 <from> 更改为 <to>。 您可以用它来重新定位整个源代码(子代码)树。

  • 如果库在主机和目标上有不同的路径,帮助调试器找到它们:
    
    		(gdb) set solib-search-path <lib_paths>
    
    		

    <lib_paths> 是一个用冒号隔开的列表,其中包含在主机上查找库的路径

    由于协处理器上的 Linux* 环境为真实环境,所以调试与在主机上相同!

使用 PDBX 进行远程调试

如要正常使用 PDBX,需要满足一些先决条件。 使用 pdbx 检查命令,以确认 PDBX 是否能够使用:

  1. 第一步:
    
    		(gdb) pdbx check
    
    		checking inferior...failed.
    
    		


    解决方案:
    启动远程应用(低级),并达到某个断点(如 b main & run)
     
  2. 第二步:
    
    		(gdb) pdbx check
    
    		checking inferior...passed.
    
    		checking libpdbx...failed.
    
    		


    解决方案:

    使用 set solib-search-path <lib_paths> ,在主机上提供 libpdbx.so.5 的路径。

  3. 第三步:
    
    		(gdb) pdbx check
    
    		checking inferior...passed.
    
    		checking libpdbx...passed.
    
    		checking environment...failed.
    
    		


    解决方案:
    在针对 OpenMP* 的目标上设置其他环境变量。 这些需要在启动 GDBServer 后进行设置(与设置 $LD_LIBRARY_PATH 相同)。
  • $INTEL_LIBITTNOTIFY32=""
  • $INTEL_LIBITTNOTIFY64=""
  • $INTEL_ITTNOTIFY_GROUPS=sync

使用 Eclipse* IDE 进行调试

英特尔提供了一款面向英特尔® MIC 的 Eclipse* IDE 调试器插件,其具备以下特性:

  • 无缝调试主机和协处理器
  • 同时查看主机和协处理器线程
  • 支持多协处理器卡
  • 支持 C/C++ 和 Fortran
  • 支持卸载扩展(自动添加至卸载的代码)
  • 支持英特尔® 集成众核架构(英特尔® MIC 架构): 寄存器与反汇编

Eclipse* IDE with Offload Debug Session

英特尔® MPSS 和英特尔® Composer XE 中均包含该插件。

先决条件

如要使用提供的插件,需要满足以下的先决条件:

  • 支持的 Eclipse* IDE 版本:
    • 4.4 (包含 Eclipse C/C++ 开发工具 (CDT) 8.3 或更高版本)
    • 4.3 (包含 Eclipse C/C++ 开发工具 (CDT) 8.1 或更高版本)
    • 4.2 (包含 Eclipse C/C++ 开发工具 (CDT) 8.1 或更高版本)
    • 3.8 (包含 Eclipse C/C++ 开发工具 (CDT) 8.1 或更高版本)

我们推荐: 面向 C/C++ 开发人员的 Eclipse* IDE (4.4)

  • Java* 运行时环境 (JRE) 6.0 或更高版本 (7.0 适用于 Eclipse* 4.4)
  • 面向 Fortran 的可选 Photran* 插件
  • Remote System Explorer (又称, 目标管理),可调试本地协处理器应用
  • 仅在使用英特尔® Composer XE 的插件时,针对 Eclipse* IDE 环境查找 debuggervars.[sh|csh] 的源!

安装英特尔® C++ 编译器插件(可选):
通过 “Install New Software…” 添加插件:
Install Intel® C++ Compiler plug-in (optional)

该插件是英特尔® Composer XE (<composer_xe_root>/eclipse_support/cdt8.0/) 的组件。 它可添加英特尔® C++ 编译器支持,该支持不是调试必须的特性。 对于 Fortran,对应的是 Photran* 插件。这些插件可以帮助获得最佳体验。

注:
取消勾选 “Group items by category”,否则列表将为空!
此外,建议在最新版本上禁用检查。 否则,安装时间将会过长,安装的新组建可能无法与 vanilla Eclipse 包兼容。 这些可能导致出现故障。

安装插件,以便进行卸载调试

通过 “Install New Software…” 添加插件:
Install Plug-in for Offload Debugging

插件包含在:

  • 英特尔® MPSS:
    • MPSS 2.1: <mpss_root>/eclipse_support/
    • MPSS 3.*: /usr/share/eclipse/mic_plugin/
  • 英特尔® Composer XE:<composer_xe_root>/debugger/cdt/

注:
取消勾选 “Group items by category”,否则列表将为空!
此外,建议在最新版本上禁用检查。 否则,安装时间将会过长,安装的新组建可能无法与 vanilla Eclipse 包兼容。 这些可能导致出现故障。

配置卸载调试

  • 为 “C/C++ Application” 创建新的调试配置
  • 点击 “Select other…” 并选择 MPM (DSF) Create Process LauncherConfigure Offload Debugging
    “MPM (DSF) Create Process Launcher” 需要在我们的插件中使用。请注意,该指令对于 C/C++ 和 Fortran 应用均适用! 即使安装了 Photran* 并显示 “Fortran Local Application” 条目(上方的截屏并非此界面!),请勿使用它。 它不支持使用 MPM。
  • 在 “Debugger” 选项卡中,指定英特尔 GNU* GDB 的 MPM 脚本:
    • 英特尔® MPSS:
      • MPSS 2.1: <mpss_root>/mpm/bin/start_mpm.sh
      • MPSS 3.*: /usr/bin/start_mpm.sh
        (对于 MPSS 3.1.1、3.1.2 或 3.1.4,请参见勘误
    • 英特尔® Composer XE:
      <composer_xe_root>/debugger/mpm/bin/start_mpm.sh
      Configure Offload Debugging (Debugger)
      此时,您将最终添加面向卸载调试的英特尔 GNU* GDB(使用 MPM (DSF))。 该脚本可帮助设置全部所需环境。 无需其他配置(如,协处理器卡、GDBServer & 端口、IP 地址等);它以完全自动化和透明的方式运行。

开始加载调试

支持卸载调试的应用与主机上的本地应用没有太大不同:

  • 使用卸载扩展(C/C++ 或 Fortran)创建并构建一个可执行文件
  • 请勿忘记添加调试信息 (-g) 并降低优化级别(如果可以)(-O0)
  • 启动调试会话:
    • 主机与目标调试器将无缝合作。
    • 主机与目标上的所有线程均将显示和描述
    • 调试步骤与从 Eclipse* IDE 中调试相同

Eclipse* IDE with Offload Debug Session (Example)

该示例展示了卸载调试的状态。 在左侧,我们看到主机 & mic0 线程正在运行。 协处理器上的一个线程 (11) 达到我们在卸载代码循环中设置的断点。 运行控制(步进、继续等)、设置断点、评估变量/内存...按照以往的方式操作。

卸载调试的其他要求

对于支持卸载调试的应用,还需设置其他环境变量:

  • 英特尔® MPSS 2.1:
    COI_SEP_DISABLE=FALSE
    MYO_WATCHDOG_MONITOR=-1
     
  • 英特尔® MPSS 3.*:
    AMPLXE_COI_DEBUG_SUPPORT=TRUE
    MYO_WATCHDOG_MONITOR=-1

 

请在启动 Eclipse* IDE 前设置上述变量!

目前需要它们,但是未来可能会将其淘汰。 请注意,调试程序不能且不应与英特尔® VTune™ Amplifier XE 一起使用。 因此,应禁用 SEP(英特尔® VTune™ Amplifier XE 的组件)。 必须禁用看门狗监控器,因为调试器可能在一段不确定的时间内阻止系统执行。 因此,系统看门狗可能认为被调试的应用(如果不再有反应)死机并将终止它。 对于调试而言,我们不希望看到这种情况。

注:
请勿为产品系统设置这些变量!

对于英特尔® MPSS 3.2 和更高版本:
MYO 调试库不再默认与英特尔 MPSS 3.2 一起安装。 这与以前的英特尔 MPSS 版本不同。 用户必须手动安装 MYO 调试库,才可使用面向卸载调试的 Eclipse 插件对支持 MYO 的应用进行调试。 对于英特尔 MPSS 3.2 (和更高版本),MYO 调试库位于 mpss-myo-dbg-* 软件包,该软件包包含在 mpss-*.tar 文件中。

MPSS 3.2 和 3.2.1 不支持使用英特尔® Composer XE 2013 SP1 进行卸载调试,请参见 勘误,了解更多信息!

 

配置本地调试

配置 Remote System Explorer
为了调试本地协处理器应用,我们需要配置 Remote System Explorer (RSE)。

注:
在继续之前,请确保 SSH 能够使用(如通过命令行)。 您还可通过 RSE 来指定其他证书(用户账户)并保存密码。

基本步骤非常简单:

  1. 显示 Remote System 窗口:
    Menu Window->Show View->Other…
    选择: Remote Systems->Remote Systems
     
  2. 为每个协处理器添加一个新系统节点:
    RSE Remote Systems Window
    Remote Systems 窗口中的上下文菜单: New Connection…
  • 选择 Linux,按 Next>
  • 指定协处理器的主机名(如 mic0),按 Next>
  • 在以下对话中选择:
    • ssh.files
    • processes.shell.linux
    • ssh.shells
    • ssh.terminals

 

为每枚协处理器重复该步骤!

 

转移 GDBServer
远程调试需要将 GDBServer 转移至协处理器。 此处我们选择 /tmp/gdberver 作为协处理器上的目标(对于以下部分非常重要)。

将 GDBServer 转移至协处理器目标,如:


	$ scp <composer_xe_root>/debugger/gdb/target/mic/bin/gdbserver mic0:/tmp

	


在开发过程中,您也可以将 GDBServer 添加至您的协处理器映像!

注:
参见上文在命令行上调试 部分,了解 GDBServer 的正确路径,具体取决于所选的软件包 (英特尔® MPSS 或英特尔® Composer XE)!

调试配置

Eclipse* IDE Debug Configuration Window

如要为本地协处理器应用创建一个新调试配置(此处为: native_c++),请为 C/C++ 远程应用创建一个新配置。

为之前使用 RSE 配置的协处理器目标设置连接(此处为: mic0)。

指定应用的远程路径 — 无论其复制到哪个位置(此处为: /tmp/native_c++)。 我们稍后将会介绍如何手动转移文件。

如果您不希望调试器将可执行文件上传至指定路径,可以为 “Skip download to target path” 设置标记。 如果项目带有外部依赖性,非常复杂,且您不想手动转移二进制数据,这一特性非常有意义。
(对于 MPSS 3.1.2 或 3.1.4,请参阅勘误

请注意,此处我们使用了 C/C++ 远程应用。 这对于 Fortran 应用也同样适用,因为 Photran* 插件没有提供远程调试配件部分!

Eclipse* IDE Debug Configuration Window (Debugger)

在 Debugger 选项卡中,为英特尔® MIC 指定提供的英特尔 GNU* GDB(此处为: gdb-mic)。

Eclipse* IDE Debug Configuration Window (Debugger) -- Specify .gdbinit

在上面的示例中,在 .gdbinit 中从 MPSS 安装设置 sysroot,如:


	set sysroot /opt/mpss/3.1.4/sysroots/k1om-mpss-linux/

	


您可以使用 .gdbinit 或启动调试会话前应加载的任何其他命令行文件。 如果不指定它,则无法获得针对系统库的调试器支持。

注:
参见上文在命令行上调试 部分,了解 GDBServer 的正确路径,具体取决于所选的软件包 (英特尔® MPSS 或英特尔® Composer XE)!

Eclipse* IDE Debug Configuration Window (Debugger/GDBServer)

在 Debugger/Gdbserver Settings 选项卡中,指定上传的 GDBServer(此处为: /tmp/gdbserver)。

为协处理器构建本地应用

配置取决于所安装的插件。 对于 C/C++ 应用,我们建议安装 Composer XE 随附的英特尔® C++ Compiler XE 插件。 对于 Fortran,可安装 Photran*(第三方)并手动选择英特尔® Fortran Compiler。

确保使用调试配置并提供在主机上调试时所需的选项(-g)。 或者,通过 –O0 禁用优化能够让指令流在调试时可理解。

与主机构建的唯一不同之处在于您需要为协处理器进行交叉编译: 使用 –mmic 选项,如:
Eclipse* IDE Project Properties

配置后,清理 build。 这一操作是必要的,因为 Eclipse* IDE 可能无法注意到全部依赖关系。 最后,进行构建。

注:
配置对话仅针对英特尔® C++ 编译器插件显示。对于 Fortran,用户需要安装 Photran* 插件并需要手动将编译器/连接器切换至 ifort ,然后手动添加 -mmic。 这一操作必须在编译器与连接器上都执行!

启动本地调试

将可执行文件转移协处理器,如:

  • 手动复制(如通过终端上的脚本)
  • 使用 Remote Systems 窗口 (RSE) 从主机上复制文件,并粘贴到协处理器目标(如 mic0):
    RSE Remote Systems Window (Copy)
    从树 (Local Files) 上选择目标,并将其粘贴至想要放置的目标上(如 mic0)
  • 使用 NFS 将 build 映射至协处理器(无需更新)
  • 使用调试器进行转移(参阅以前的版本)

 

注:
一定要确保可执行文件能够在协处理器上执行。 在某些情况下,复制后,执行字节可能无法设置。

使用以前的步骤中创建的 C/C++ 远程应用开始调试。 它应连接至协处理器目标并通过 GDBServer 启动指定的应用。 调试流程与本地/主机应用上的相同。
Native Debugging Session (Remote)

注:
这与协处理器本地 Fortran 应用的操作方式完全相同!

文档

更多信息,请参见官方文档:

  • 英特尔® MPSS:
    • MPSS 2.1:
      <mpss_root>/docs/gdb/gdb.pdf
      <mpss_root>/eclipse_support/README-INTEL
    • MPSS 3.*:
      尚未发布(请参见勘误
  • Intel® Composer XE:
    <composer_xe_root>/Documentation/[en_US|ja_JP]/debugger/gdb/gdb.pdf
    <composer_xe_root>/Documentation/[en_US|ja_JP]/debugger/gdb/eclmigdb_config_guide.pdf

PDF gdb.pdf 是针对英特尔发布的基本版本的最初 GNU* GDB 手册,后加入新增的所有特性。 因此,您可以从此处获得有关新命令、运行状况等的帮助。英特尔® MPSS 中的
README-INTEL 可简单地指导用户安装和配置 Eclipse* IDE 插件。
PDF eclmigdb_config_guide.pdf 提供了全面的分步指南,可帮助用户使用命令行和 Eclipse* IDE 进行调试。

在 Linux* 上使用带有 Eclipse* IDE 的英特尔® C++ 编译器。
http://software.intel.com/en-us/articles/intel-c-compiler-for-linux-using-intel-compilers-with-the-eclipse-ide-pdf/
知识库文章(在 Linux* 上使用带有 Eclipse* IDE 的英特尔® C++ 编译器)分步介绍了如何安装、配置和使用带有 Eclipse* IDE 的英特尔® C++ 编译器。

勘误

  • 近期从 MPSS 2.1 切换至 3.1,一些软件包可能不完整或丢失。 以后的更新将会添加更多改进。 目前,面向 GNU* GDB 的文档丢失。
     
  • 对于 MPSS 3.1.2 和 3.1.4,各自的软件包 mpss-3.1.[2|4]-k1om.tar 丢失。 它包括针对协处理器的二进制,如 针对协处理器的本地 GNU* GDB。 它还包括 /usr/libexec/sftp-server;如果您想要在协处理器上调试本地应用并希望 Eclipse* IDE 自动传输二进制,则需要使用它。 鉴于其已丢失,您需要手动转移该文件(在本案例中选择 “Skip download to target path.”)。
    如要解决该问题,可以使用 MPSS 3.1.1 的 mpss-3.1.1-k1om.tar,并从该位置安装二进制。 如果您使用的是 MPSS 3.1.4,则可通过 mpss-3.1.4-k1om-gdb.tar 单独获取本地 GNU* GDB。
     
  • 对于 MPSS 3.1.1、3.1.2 或 3.1.4,脚本 <mpss_root>/mpm/bin/start_mpm.sh 使用错误的路径连接至 MPSS 根目录。 因此,卸载调试无法解决。 您可以通过为 MPSS 根创建符号链接来修复它,如对于 MPSS 3.1.2:
    $ ln -s /opt/mpss/3.1.2 /opt/mpss/3.1
    新版 MPSS 解决了该问题。 如果您使用的是英特尔 (R) Composer XE 软件包中的 start_mpm.sh 脚本,将不需要此解决方案。
  • 对于 MPSS 3.*,协处理器本地 GNU* GDB 需要一些系统库的调试信息才可正常操作。
    自 MPSS 3.1 起,协处理器上将不再安装系统库的调试信息。 如果执行了协处理器本地 GNU* GDB,当加载/继续使用信号时(SIGTRAP)将会失败。
    目前的解决方法是将系统库的 .debug 文件夹复制到协处理器上,如:
    $ scp -r /opt/mpss/3.1.2/sysroots/k1om-mpss-linux/lib64/.debug root@mic0:/lib64/
  • MPSS 3.2 和 3.2.1 不支持使用英特尔® Composer XE 2013 SP1 卸载调试。
    英特尔 MPSS 3.2 和 3.2.1 不支持使用英特尔® Composer XE 2013 SP1 的 Eclipse 插件卸载调试。 英特尔 MPSS 3.2 和 3.2.1 中删除了英特尔 Composer XE 2013 SP1 软件包操作所需的一个配置文件。 之前的英特尔 MPSS 版本不受影响。 英特尔 MPSS 3.2.3 修复了此问题(没有英特尔版本 MPSS 3.2.2 !)。
有关编译器优化的更完整信息,请参阅优化通知