This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/MSP430-GCC-opensource:GNU 调试器内部错误

Guru**** 2394295 points
Other Parts Discussed in Thread: MSP430G2231, MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/606415/linux-msp430-gcc-opensource-gnu-debugger-internal-error

器件型号:MSP430-GCC-opensource
主题中讨论的其他器件:MSP430G2231MSP430G2553

工具/软件:Linux

您好!

我刚刚使用以下两个文件在 Slackware 64 Linux 上构建了由 somnium 维护的开源编译器工具链:

msp430-gcc-6.2.1.16_source-full.tar.bz2

msp430-gcc-support-files-1.198.zip

所有内容都可以编译而不会出现错误、并安装和运行。   我正在尝试设置 MSP430-gdb 以进行调试。

我可以成功设置断点、执行代码、运行 TUI 模式接口等

但是、每当我允许程序运行、然后尝试使用控制信号中断它时、gdb 就会崩溃:

(gdb) c 继续。
^C
远程连接已关闭
../../../gdb/gdb/value.c:1607:内部错误:value_free:断言`val->reference_count >0'失败。
检测到 GDB 内部的问题、
进一步调试可能不可靠。
是否退出此调试会话? (Y 或 n)

因此、这显然是 gdb 内部的一个错误、并且可能与 gcc 升级到6.6.1版时的 somnium 变化有关

旧的工具链没有崩溃。

我尝试查看修补程序文件中是否已存在错误修复:

msp430-gcc-6.2.1.16_source-patches.tar.bz2

但是、扩散器采用"git diff "格式;我不熟悉这种格式。  如果我尝试在文件上运行标准的 Linux"修补程序"、修补程序会抱怨至少已经应用了一些块、并询问我是否要恢复它们。

因此、我不确定源代码是否已经包括 源修补程序文件中的所有修补程序。  我看不到我 可以克隆的实际 git 存储库地址、以获取 最新的源代码并自动执行修补过程。

 TI 如何支持开源编译器工具/如何报告错误并获得帮助?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Andrew、

    此主题已发送给工具团队的我们。 通常看起来与 GNU 相关的线程的人已经离开、但明天会回来。 在此论坛上报告 GNU 工具链的错误是可以的。 如果需要解决问题、我们可以努力重现问题、然后与 Somnium 合作。

    此致、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、John。  


    如果您需要核心文件、我相信我可以为 gdb 生成一个核心文件。  如果您有虚拟方框、我 可以向您发送我的二进制文件; 如果这有助于 团队工作、我也可以允许 SSH 登录到虚拟机。

    如果您试图重现问题、并且需要更多信息、请随时咨询。

    以下信息应证明是有用的:

    我使用 了来自 www.simplyembedded.org/.../compile-install-msp430-gcc 的 gcc 5编译指令  来构建我的二进制文件。  注: 请单击"已更新说明"链接

    我的安装目录是唯一的不同之处、因为我安装到/opt/msp430/.local 并将所有源文件保存在/opt/msp430/gcc2017中

    我 还下载并编译了 mspdebug-0.23.tar.gz、除了我的安装 目录是/opt/msp430/.local 之外、没有特殊的配置选项

    为了设置调试器、我制作了一个.gdbinit 文件和一个 MSP430-gdbproxy.rc 脚本、以及一个用于 udev 的69-ti-launchpad.rules。

    我将自己添加到 UNIX 上的拨号组:作为 root:例如  :usermod -a -G dialout 和 rew3

    然后、我安装了一个 udev 规则(作为根目录)、称为69-ti-launchpad.rules、使 ti-launchpad USB 驱动程序允许拨号用户访问该设备。  规则如下:

     

    attrs{idVendor}="0451"、ATTRS{idProduct}="f432"、mode="0660"、Group="dialout" 

    然后、我以 andrew3身份重新登录、 并插入 了 ti launchpad、并执行了"newgroup dialout"

    此时、mspdebug RF2500完全可以运行。

    要创建一个脚本、使 mspdebug 进入代理模式、我创建了以下 脚本:

    #!/bin/sh
    #将 mspdebug 置于 gdb 代理模式的脚本。
    如果
    程序名称是参数,并且 ps ax | grep -QE "mspdebug[^[]",则#也将下载并刷写程序;然后
    回显"mspdebug already running gdb proxy mode"。
    否则
    、
    如果[-z "$1"]、则回显"正在启动 MSP 调试";然后
    回显 mspdebug RF2500 gdb 2>&1 >/dev/null &
    取消
    休眠2
    ;否则
    回显"prog $1"| mspdebug RF2500
    fi
    
    

    我创建了一个 gdb 启动脚本、.gdbbinit

    Shell msp430-gdbproxy.rc
    set remoteaddressssize 64
    set remotetimeout 999999
    target remote localhost:2000
    enable TUI
    layout src
    layout reg 

    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉耽误你的时间。  MSP430 GCC 专家已收到通知。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andrew:

    我无法在 Ubuntu 16.04 LTS 上重现此问题。

    bash $ sudo ./mspdebug RF2500 gdb
    MSPDebug version 0.23 -用于 MSP430 MCU 的调试工具
    版权所有(C) 2009-2015 Daniel Beer 
    这是免费软件;请参阅复印条件的来源。 不
    提供任何保证;甚至不提供适销性或特定用途适用性。
    来自 MSP430.dll v3.3.1.4的芯片信息数据库版权所有(C) 2013 TI、Inc.
    
    正在尝试打开027上的接口1
    正在初始化 FET...
    FET 协议版本为30394216
    SET Vcc:3000mV
    、配置用于 Spy-Bi-Wire
    器件 ID:0x2553
    代码起始地址:0xc000
    代码大小 :16384字节= 16KB
    RAM 起始地址:0x200
    RAM 结束地址:0x3ff
    RAM 大小 :512字节= 0KB
    器件:MSP430G2xx3
    断点数量:2
    FET:FET 返回 NAK
    警告:器件不支持功耗性能评测
    芯片 ID 数据:25 53
    绑定到端口2000。 正在等待连接...
    从127.0.0.1:56886连接的客户端
    正在清除所有断点...
    运行
    目标已停止 

    使用运行 GDB

    目标远程:2000
    继续加载
    

    不会导致您遇到的错误、目标会继续、GDB 会按预期保持连接。

    被调试的程序是一个简单的空主程序。 您要调试的程序是什么?

    > 旧的工具链没有在我身上崩溃。

    您是指 MSP430-elf-gdb 的旧版本、还是指在使用较旧版本的 GCC 编译工程时未看到此错误?

    > 因此、我不确定源代码是否已包括 源修补程序文件中的所有修补程序。  

    源补丁存档本质上是 MSP430-gcc 发布版本的 gcc/newlib/binutils/gdb 与给定组件编号的上游版本之间的差异。 例如、如果克隆上游 GCC 存储库、签出到与差异文件名称中指定的版本相对应的标签、然后应用源修补程序、则源代码应与源代码完整包中的源代码相同。

    >  如果您有一个虚拟框,我 可以向您发送我的二进制文件

    如果您可以将加载到目标上的二进制文件附加到目标上、这会很有帮助。 然后、我可以查看我是否可以重现。 您要连接的具体 MSP430器件是什么?

    > 我使用了来自 www.simplyembedded.org/.../compile-install-msp430-gcc 的 gcc 5编译指令 来构建我的二进制文件。  注: 请单击"已更新说明"链接

    我是否可以问您为什么不使用源代码完整包随附的构建脚本构建软件包? 获得必要条件后、就像运行"/bin/bash README.txt"一样简单。

    主机系统上使用的 GCC 版本是什么?

    此外、您是否有理由希望从源代码构建而不使用提供的预构建二进制包。 预构建的二进制文件是否重现问题? 我们在交付二进制文件之前运行了 DejaGNU GDB 测试套件、因此我们可以对它们的质量充满信心。

    您是否曾尝试在没有 gdlbinit 脚本的情况下运行 GDB、并像我在上面所做的那样简单地执行该程序? 同样,您是否可以尝试禁用 TUI。

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我使用的 是一个松弛的64系统。  我 的库版本通常  与 Redhat 或 Ubuntu 不同。  过去、我一直不得不 从 源代码构建 TI 工具链、因为预编译的二进制文件通常不会链接。  将 redhd 或 Ubuntu 库安装到 Slackware 是一个难题、因此当源代码 可用时、我可以避免使用它。   我在 TI 构建的最后一个工具链是2014年末/ 2015年初。  我不记得当时 GDB 崩溃 了、尽管它的许多功能还不起作用。

    在  工具链的所有早期版本中、readme.txt 不是 可执行脚本、其内容也不 会因版本而发生变化。  当我打开 readme.txt 时、我注意   到脚本顶部显示它是在 CentOS 7上开发的... 依赖项 由 yum 控制。  Slackware 不好吃,不能吃,也不 能吃。  这 是一个纯脚本驱动的 Linux 系统、类似于 gentoo Linux。  由于我不熟悉 CentOS,除了我认为 它是 Windows 克隆之外,我没有 再看 readme.txt。

    我提供的网站链接、 在 不使用任何专有软件包管理器的情况下构建了工具链 、并针对最新版本的 GCC 6.2更新了方法。  因此、这似乎是构建适当 工具链的最可靠方法、 因为他已经有了一个有效的脚本。

    我的主机的 GCC 为5.3.0版  

    我 目前 正在为 MSP430g2231进行编译。  我 的项目目录 被称为"源"、并附加到此 帖子。

      市场上有多个编译   器、因此我有一个宏库来帮助从一个 C 编译器移植到下一个 C 编译器。  "vector.h"文件 用于 MSP430的 C 移植。

    但是、我自己仅在 GCC 上编译了代码 、 其他编译器未经过测试。

    注意:TI 网站不允许我上传.TXZ 文件作为附件。   以下讨论 不正确、 因为我无法上传二进制文件。  如何解决此问题?

    我已经包含了名为 setisr.S 的汇编语言编程库、它为 汇编语言中断例程设置矢量。  大写 S 扩展允许 C 预处理器和宏扩展在汇编文件上运行。  这使得我能够为   MSP430系列芯片编写纯粹的汇编语言程序、而无需在 C 运行时库中进行链接。  最后 、汇编使我能够最大限度地利用芯片。  setisr.S 使 我可以从 GNU 汇编器轻松地对中断进行编程、 这就是我编写中断的原因。

       有关编译每个文件的说明、请参阅报头的注释。  我 有一个通用的"build"脚本、 它只是 grep 的 gcc 行源文件、然后执行它。  我不在该 tar 归档文件中包含编译脚本。

    在项目目录中、您将找到.out 文件。  这是我从 test7seg.S 构建的最后一个二进制文件  它 是一个 elf 二进制文件。 您还会发现"内核"、我认为这 是 GDB 中的最后一个内核转储。

    我的项目正在运行一个七段 IO 板、它通过 SPI 总线、LS 位优先、16位 数据运行。  有两个74HCT 移位和锁存寄存器芯片、它们获取 SPI 数据并将其转换为可扫描的7段显示。    显示屏上有4位数字、因此我在输出  8 位字符( 即7段加小数点)的同时、将通用 LED 线扫描为低电平四位数字之一。  我还使用七段显示屏的相同4条扫描线来扫描键盘的输入开关。

    该程序是开环程序、没有错误检查、因此  即使没有连接七个段显示、它也会运行。

    要将 二进制数转换为 BCD、再转换为七个段、  可以在 BIN2DEC.S 中找到一个汇编语言函数 来执行转换。

    我的原始 项目  (此处未包括) 是 用于热板和千纳秒的完整温度/时间控制器。 它测量了加热元件的电阻 以估算温度、并以这种方式调节温度。

    我的原始项目是在旧版本的 GCC 上编译的、 这是 TI 迁移到新的开源工具链维护人员之前的日期。  我正在重写 代码、并对其进行全新测试。

    我 使用 gdb 将原始固件下载到我的 TI 芯片中。  我不记得 gdb 通过 我 目前收到的错误消息使我崩溃。

    无论 是否 使用 TUI,I gdb 仍会崩溃。

    我在没有初始化脚本的情况下运行 gdb;但我 从未像您那样运行 gdb、而没有设置 远程消息大小。   我  现在无法测试、但今晚稍后会尝试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andrew:

    我建议您从 TI 网站 http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/latest/index_FDS.html 上试用 Linux 64 MSP430 gcc 通用包

    我希望它在大多数64位 Linux 系统上都能"正常工作"、尽管我知道您在使用操作系统方面有更多的经验。 从 TI 网站分发的 GCC 软件包配置为"x86_64-redhat-Linux"。

    我认识到、您看到的错误不太可能由工具链构建方式的差异引起、但如果我们使用相同的工具链、这将是一个很好的起点。 如果预编译程序包不起作用、请尝试执行 readme.txt 脚本、因为如果您已经构建了工具、您可能已经具备了必要条件。

    您的项目似乎包含大量源文件、我们希望能够使用单个源文件构建的通用、简化的测试用例。 您能不能澄清您是否在器件的"准系统"项目中看到此错误、或者这只是您的项目中看到的错误。

    在此阶段、如果无法访问 elf 文件或源代码、我将不能再提供任何帮助、我建议您将其上载到文件共享服务并在此处发布链接。 我们没有您使用的确切电路板、最接近的是 MSP430G2553、因此如果可能、请为此器件构建项目。 正如我所理解的、G2553是一款与 G2231相似但却是卓越的芯片、因此您的项目可能只是针对这个器件进行构建、除非您有很多特定于目标的汇编代码。 这也是通用、简化的测试用例有用的另一个原因。

    谢谢