我正在尝试调试在Windows主机上针对Linux目标进行交叉编译的应用程序。
问题:
由于初始编译是在Windows中,因此二进制文件中存储的源文件路径的格式为C:\Users\foo\project\...
。在Linux目标上,我将源文件放在\home\foo\project\....
下默认情况下,由于路径不同,gdb找不到源文件。
到目前为止我尝试过:
在gdb中使用“directory”命令为正在调试应用程序的目标Linux系统中的.c源文件提供确切路径。这很有效,但不幸的是有数百个文件,所以这个解决方案是不现实的。
使用set substitute-path C:\\Users\\foo\\project /home/foo/project
命令让gdb替换所有前缀。请注意,\\
似乎是必要的,以便show substitute-path
注册正确的字符串。遗憾的是,这不起作用。我的猜测是,substitute-path命令不能处理ms-dos样式路径。
尝试将调试信息分离为单独的.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样式路径。
我查看了stackoverflow,虽然有类似的主题我找不到任何可以帮助我的东西。非常感谢任何建议/帮助。我意识到从Windows进行交叉编译是一种非常迂回的方式,但目前无法避免这种情况。
由于
答案 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和脚本,但如果有人有其他建议,我有兴趣选择: - )