[c++, gdb, cygwin] как изменить пути к исходникам в pdb ?

Maurog

Имеется следующая проблема: есть большой проект, который собирается только цигвином под виндой. бинарники копируются на юникс-систему и там запускаются.
Требуется сделать получающийся бинарник debug-friendly.
Использую kubuntu 7.10 для дебуга + ddd\kdevelop.
Основная проблема сейчас с путями к исходным файлам - они виндовозные: c:/mydir/main.cpp и тд.
Пытался сделать сделать аналогичную структуру каталогов на юникс-системе (сделал каталог "C:" и тд но gdb спотыкается на двоеточии и говорит Cannot load source C.
Хотелось бы подхачить выходную дебуг-информацию, чтобы пути стали более адекватными.
Копал в сторону gcc:
-fdebug-prefix-map=old=new
When compiling files in directory old, record debugging information describing them as in new instead.
но моя версия gcc не знает такого ключика (и я не уверен, что он поможет).
Смотрел ключики от gdb, objdump, objcopy тоже ничего умного не нашел.
Писать свою тулзу с использованием BFD, которая будет наподобие objcopy - это я могу не осилить.
Еще можно было бы все папки из проекта добавить в dirs у gdb (их несколько сотен будет но имена файлов не уникальны, думаю, тут gdb споткнется и будет некорректно отображать файлы.
В общем, жду здравых идей и _конкретных_ предложений.
Претензии, что "так никто не делает" прошу оставить при себе.

klyv

а если заменить с: на c_? :smirk:

Maurog

да, этот вариант тоже есть
надо отыскать бинари едитор, но у меня нет уверенности что все пройдет гладко вдруг там хеши\црс прописаны и файл станет corrupted.

bleyman

А как так получается, что в результате сборки "цигвином под виндой" у тебя пути виндовые? Ты уверен, что у тебя там не затесался где-нибудь какой-нибудь виндовый линкер (от вижуалстудии, например) вместо линкера под цигвин?

Maurog

я тоже сначала недоумевал
если выполнить команду в винде:
gcc.exe -g C:\cygwin\opt\crosstool\i686-unknown-linux-gnu\gcc-4.2.3-glibc-2.7\bin\tmp.cpp
и открыть на просмотр полученный a.out, то там можно увидеть C:\cygwin\...

procenkotanya

если выполнить команду в винде:
gcc.exe -g C:\cygwin\opt\crosstool\i686-unknown-linux-gnu\gcc-4.2.3-glibc-2.7\bin\tmp.cpp
и открыть на просмотр полученный a.out, то там можно увидеть C:\cygwin\...
Это логично, gcc же не будет специально пути переписывать.
А неужели в цигвине нет unix-like дерева каталогов, чтобы можно было писать а-ля gcc[.exe] -g /opt/crosstool/.../tmp.cpp?

bleyman

А зачем ты выполняешь такую команду в винде?
Кто мешает написать с прямыми слешами? Только там не C:/blablabla будет (точнее, так тоже будет работать, потому что винда понимает прямые слеши, но твою проблему это не решит а /cygdrive/c/blablabla, если я правильно помню.
Вообще почему ты это всё не из цигвиновского баша же делаешь? Там ты можешь в точности такое дерево сделать, какое будет на дебагаемой машине, прям симлинками из-под его /, и не париться вообще.

Maurog

я не могу управлять путями, ибо ими занимается wmake + сложные билдовые скрипты.
у меня есть лишь возможность приписать ключи к компилятору gcc.
в общем, опять всех понесло не в том направлении =\

bleyman

Ну так в сложных билдовых скриптах ты точно серч энд реплейс "c:\bla" на "/cygdrive/c/bla" можешь сделать, не? Ну, плюс оставшиеся слеши поправить.
Это действительно самый правильный вариант.

Maurog

бинарная замена в pdb не помогла - гдб не хавает больше символы =\
в моей мейк системе невозможно сделать такой реплейс (там еще виндовый драйвер участвует для поиска депендов и спец ехешник, который натравливает gcc на исходники)

evgen5555

в моей мейк системе невозможно сделать такой реплейс
так сделай туда инсёрт!

klyv

гдб не хавает больше символы
не понял фразы, но предложу заменить общий префикс на путь к какому-нить симлинку. напрмер, в корне. так, чтобы буков было ровно столько же.

Maurog

если заменить "C:" на "C2", то гдб уже не грузит такие символы

klyv

если заменить "C:" на "C2", то гдб уже не грузит такие символы
почему ит?..
все папочки-мамочки есть?
Оставить комментарий
Имя или ник:
Комментарий: