views:

111

answers:

1

Hi,

I've set up a symbol-server for one of my current projects. During a nightly build I:

  • build my source
  • apply a label to the sourcefiles that have been used in the build
  • index the pdb files with the necessary information
  • stored the pdb files in the MS symbol server

(In fact, I've followed this article: Source Server helps you kill bugs.

Now, I have referenced the DLL that has its symbols published in another project. I debug that project, and I want to step into the code of the project that has published debug symbols.

I've set up VS.NET so that Source Server support is enabled. When I debug my project, I can see (in the Modules window) that the symbols for my referenced project have indeed been loaded. When I want to step into a method that originates from the referenced DLL, VS.NET pops up a warning where I must confirm that VS.NET may indeed execute a command to obtain the source code from the source server.

The command looks like this:

ss.exe get -GL"c:\Users\... -GF -I-Y -W "$/MyProject/Source/..." -VL"specificversion"

(I have ommitted the full paths for brevity).

When I run the command, I get the error 'no source code available'.

When I execute that command on the command line, I get the error:

Invalid DOS Path

It seems that VSS returns this error when the target path does not exists. Indeed, the local path where the retrieved source file should be put, does not exists on my disk. VSS should create it.

How can I make sure that VS.NET issues a command so that the target path will be created when source code is retrieved from a source server ?

EDIT: I've managed to get a little bit further in my quest. On my Source Server machine, I've editted the vss.pm file, and I've changed the command that is written in the VSS_EXTRACT_CMD variable that exists inside the 'stream' that is written in the PDB file. I've changed the (Perl?) code to this:

push(@stream, "VSS_EXTRACT_CMD=if not exist %vsstrgdir% mkdir %vsstrgdir% | ss.exe get ".
                                   "-GL\"%vsstrgdir%\" -GF- -I-Y ".
                                   "-W \"\$/%var3%\" -VL\"%var4%\"");

So, in fact I've added the 'if not exists ... mkdir ...' part to it, and I've separated the two commands with a pipe (|).

In VS.NET, I've specified that the SourceServer commands that are issued by VS.NET, should be written in the output window as well. So, when I copy the command that I find in the output window, and I execute that command on the command prompt, the directory is created and the file is retrieved. \o/

Unfortunately, when VS.NET does this, the file is not retrieved, and the directory has not been created as well ... Any ideas on what the problem could be ?

Edit: I've tested this on a Windows XP machine, and, it works. I use Windows Vista at the office, and on Vista, it doesn't work. It seems like VS.NET is not allowed to create the target-directory ?

A: 

I'm still stuck on this.

I've changed the vss.pm file, so that another command is written into the VSS_EXTRACT_CMD variable. I've modified it, so that a batch file is executed:

push(@stream, "VSS_EXTRACT_CMD=ssget.cmd %vsstrgdir% %var3% %var4%");

This batch file looks like this:

ssget.cmd

if not exist %1 md %1
ss.exe get -GL"%1" -GF- -I-Y -W "%2" -VL"%3"

When I execute the batchfile from the command prompt (opened via VS.NET), it works fine. The directory is created, the file is retrieved.

However, when VS.NET executes this batch file while debugging, it seems like nothing happens ?

I'm running Vista here. Any ideas ?

Frederik Gheysels