如何在Linux上获取gdb,以便在windows上查找二进制交叉编译的源文件

时间:2015-01-22 10:54:39

标签: linux windows gdb cross-compiling

我正在尝试调试在Windows主机上针对Linux目标进行交叉编译的应用程序。

问题: 由于初始编译是在Windows中,因此二进制文件中存储的源文件路径的格式为C:\Users\foo\project\...。在Linux目标上,我将源文件放在\home\foo\project\....下默认情况下,由于路径不同,gdb找不到源文件。

到目前为止我尝试过:

  1. 在gdb中使用“directory”命令为正在调试应用程序的目标Linux系统中的.c源文件提供确切路径。这很有效,但不幸的是有数百个文件,所以这个解决方案是不现实的。

  2. 使用set substitute-path C:\\Users\\foo\\project /home/foo/project命令让gdb替换所有前缀。请注意,\\似乎是必要的,以便show substitute-path注册正确的字符串。遗憾的是,这不起作用。我的猜测是,substitute-path命令不能处理ms-dos样式路径。

  3. 尝试将调试信息分离为单独的.debug文件(请参阅How to generate gcc debug symbol outside the build target?),然后使用debugedit使用命令debugedit --base-dir=C:\Users\foo --dest-dir=/home/foo project.debug更改路径。不幸的是,这也不起作用。 debugedit似乎工作正常,如果现有的路径都是UNIX / Linux,但似乎不适用于ms-dos样式路径。

  4. 我查看了stackoverflow,虽然有类似的主题我找不到任何可以帮助我的东西。非常感谢任何建议/帮助。我意识到从Windows进行交叉编译是一种非常迂回的方式,但目前无法避免这种情况。

    由于

2 个答案:

答案 0 :(得分:1)

虽然这是一个相当古老的问题,但我确实遇到了同样的问题。我设法解决了它,但在二进制可执行文件上使用sed ...(是的,' bit' hack-ish,但没有找到另一种方式)。使用sed我已设法替换可执行文件内的符号路径,诀窍是新路径的长度应与旧路径相同。

sed -i "s#C:/srcpath#/srcpath/.#g" ./executable

确保新路径的长度相同,否则可执行文件会生效。

答案 1 :(得分:0)

我也有同样的问题。您的选项1没有您想象的那么糟糕,因为您可以使用类似此python代码的脚本编写所有“目录”命令的脚本:

def get_directory_paths():
    return_array = list()
    unix_path = os.path.join('my','unix','path')
    for root, dirs, files in os.walk(unix_path):
        for dir in dirs:
            full_unix_path = os.path.join(root,dir)
            escaped_unix_path = re.sub("\s", "\\\\ ", full_unix_path)
            return_array.insert(0, "directory " + escaped_unix_path)
    return '\n'.join(return_array)

缺点是,如果你在不同目录中有两个同名的源文件,我认为gcc不能选择正确的文件。这让我很担心,但在我的特殊情况下,我认为我很安全。

对于选项2(我怀疑它会修复来自#1的别名条件),我认为问题是替换不是以linux的“文件分隔符”结尾,所以它们不适用:

  

为避免意外的替换结果,仅当目录名的from部分以目录分隔符结束时才应用规则。例如,将/ usr / source替换为/ mnt / cross的规则将应用于/usr/source/foo-1.0,但不应用于/usr/sourceware/foo-2.0。并且由于替换仅应用于目录名称的开头,因此该规则也不会应用于/root/usr/source/baz.c。“(来自https://sourceware.org/gdb/current/onlinedocs/gdb/Source-Path.html#index-set-substitute_002dpath

我没有尝试过像#3这样的东西,我也考虑过像@dragn的建议,但在我的情况下,路径甚至没有接近相同的长度,所以这将是一个问题。

我认为我坚持使用#1和脚本,但如果有人有其他建议,我有兴趣选择: - )

相关问题