Debug in VSCode with Rack-SDK?

Hi all,

I’m trying to debug my plugin using VSCode and Rack-SDK.
But for some reasons, it doesn’t work.
I’m using msys64, make (gcc) and gdb.

Here’s my VSCode settings:

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build vcv rack plugin",
            "type": "shell",
            "command": "make install",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "C:\\Program Files\\VCV\\Rack\\Rack.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/../..",
            "environment": [{ "name" : "PATH", "value" : "${workspaceFolder}/../../dep/bin;C:/msys64/mingw64/bin;${env.PATH}" }],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }                
            ],
            "logging": {
                //"trace": true,
                //"traceResponse": true
                "engineLogging": true

            },
            "preLaunchTask": "build vcv rack plugin"
        },
        { 
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "C:\\Program Files\\VCV\\Rack\\Rack.exe",
            "processId": "${command:pickProcess}",
            "MIMode": "gdb",
            "miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe",
            "preLaunchTask": "build vcv rack plugin"
        }
    ]
}

When I run the Debug (F5), it correctly make install the plug, attach gdb and run Rack.exe (where I can load my plug).
But if I place a breakpoint in the middle of ::step() function, its not triggered.

What’s wrong? How do you do this?

Thanks

1 Like

VSCode isn’t a debugger. It simply uses gdb as a backend, and you can configure the command line arguments to run it. I don’t use VSCode, but on the command line, you’d type gdb ./Rack.

Of course. But which command do you use to build and install the plugin attached to gdb? “make install” do nothing. It seems it doesn’t trigger the breakpoint on the debugger when I run my plug.

@Vortico: edited my question with many details and focusing on the real problem. Hope now its more clear. Feel free to delete your answer and my reply, keeping a clean post.

Hope you can help me :wink:

Three suggestions for this:

You’re running Rack.exe in Program Files - is that really where your freshly-built plugin is being built? It seems like an odd place to be building your own modules.

You might need to modify plugin.mk so that it doesn’t call strip. In my Windows build environment, I’ve commented out that line like this:

ifdef ARCH_MAC
	$(STRIP) -S dist/$(SLUG)/$(TARGET)
else
	# RJH $(STRIP) -s dist/$(SLUG)/$(TARGET)
endif

Finally, you might want to remove the optimisation flags from compile.mk:

# Optimization
## RJH, was: FLAGS += -O3 -march=nocona -ffast-math -fno-finite-math-only
FLAGS += -march=nocona -ffast-math -fno-finite-math-only

That’s not strictly necessary, but debugging optimised code isn’t very rewarding unless you really need to do it.

@Richie Thanks for the reply.
I don’t really deploy my plug on Rack folder. I do a make install, which build+dist+Copy (by default) to the standard plugin folder (which is nice I think, in the user document files).

The problem Is that makefile miss the debug directive.
I think I should add it manually? Can’t debug a release deploy…

I have no “debug directive” in my makefile, and it works for me. Please try removing the call to strip from plugin.mk and rebuilding your plugin. Without that strip command, my breakpoints fire and I can debug, and if I put back the strip command, my breakpoints don’t fire.

Which command do you use? “make install”?

To start debugging, I just hit F5 in Visual Studio. (I’m using the full Visual Studio rather than Visual Studio Code, but they work similarly in terms of debugging via MinGW GDB.)

I’m confused by your question - you said in your original post that you can hit F5, the debugger starts up, and it all works except that your breakpoints don’t fire. All I’m suggesting is that you remove the strip call from plugin.mk, rebuild your plugin, and do exactly what you were doing before. The fact that your plugin is no longer stripped should make the debugger work (unless there are further problems, of course).

@Richie yes, I press F5, which first start my build vcv rack plugin task, which basically run make install.
Tried to remove that strip call from plugin.mk: the same, the breakpoint its not triggered.

I’ve also removed optimization flags; nothing to do :frowning:

Can you share your configs file and what version of Visual Studio?

Ok, finally I’ve got the problem!
If I delete my plugin folder (i.e. Template) on C:\Users\Nowhk\Documents\Rack\plugins, hitting F5 generate correctly the Template-0.6.0-win.zip file on that folder. But once Rack is automatically opened, that zip is simply ignored (not unzipped and replaced by the old folder).

So it never replace the current one (if any; else it open Rack without it).

Any idea how to fix this?

Nuts. Then I don’t know what’s going wrong. The next things I would try are:

Check in the debugger’s output window, or the Modules list, or with Process Explorer, that the DLL you’re loading into Rack is actually the DLL you’ve just built, both in terms of its location on the disk and the timestamp of the file. If I had a pound for all the times I’ve been trying to debug entirely the wrong executable, I’d be a rich man!

Try breaking into the running process, then setting your breakpoint, then resuming the process. I’ve had trouble with the Visual Studio / GDB combination not setting breakpoints properly unless you set them while the process is stopped in the debugger. In Visual Studio, the usual “Break All” command doesn’t work - to break into the running process you have to focus Rack and press F12. Strange but true.

If all else fails, you could install Visual Studio Community (which is free for personal or small business use) and I’ll send you my known-working config files.

@Richie maybe you forgot my last message above. the problem is that run launch.json with task, once opened Rack, it doesn’t unzip+replace the generated dist zip file.

Any ideas?

Sorry - our messages crossed over!

I don’t know why Rack isn’t unpacking your zip. I’m working with my own build of Rack, and building my modules within its plugin directory, so it’s not something my setup needs to do.

The only thing that’s obviously different between your setup and mine that might be having an effect is that my cwd setting is the directory of Rack.exe (and the Start Menu shortcut that a stock Rack installation creates does the same thing). It’s a bit of a long shot, but you might find that setting your cwd to C:\Program Files\VCV\Rack in launch.json makes it work.

@Richie: tried your suggestion, but still doesn’t work.
That’s really strange.

@Vortico: any idea why launch Rack from VSCode (i.e. launch.json) it doesn’t zip+replace the dist zip?

I don’t know, I don’t use Visual Studio Code. What command does make install run? Does log.txt say it extracts?

@Vortico make install its the script you have done :slight_smile: It correctly make the .zip and copy on my user document’s folder. Than, gdb load the Rack.exe (as write in the config above).

Here’s Rack.exe log when I open it manually (with the zip dist there with only make install):

[0.000 info src/main.cpp:67] VCV Rack 0.6.2c
[0.000 info src/main.cpp:70] Global directory: C:\Program Files\VCV\Rack/
[0.000 info src/main.cpp:71] Local directory: C:\Users\tcdalmar\Documents/Rack/
[0.000 info src/plugin.cpp:303] Extracting package C:\Users\tcdalmar\Documents/Rack/plugins/NWK-0.6.2c-win.zip
[0.031 info src/plugin.cpp:125] Loaded plugin AS 0.6.13 from C:\Users\tcdalmar\Documents/Rack/plugins/AS/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin AudibleInstruments 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/AudibleInstruments/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Befaco 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Befaco/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXDistortionPack 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXDistortionPack/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXF35 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXF35/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXReverb 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXReverb/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXWave 0.6.1 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXWave/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Bogaudio 0.6.13 from C:\Users\tcdalmar\Documents/Rack/plugins/Bogaudio/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Edge 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/Edge/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin ESeries 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/ESeries/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Fundamental 0.6.2 from C:\Users\tcdalmar\Documents/Rack/plugins/Fundamental/plugin.dll
[0.031 info src/plugin.cpp:125] Loaded plugin Grayscale 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Grayscale/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin HetrickCV 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/HetrickCV/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin Hora-ModulationFree 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Hora-ModulationFree/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin ImpromptuModular 0.6.16 from C:\Users\tcdalmar\Documents/Rack/plugins/ImpromptuModular/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin JW-Modules 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/JW-Modules/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin LOGinstruments 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/LOGinstruments/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin mscHack 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/mscHack/plugin.dll
[0.046 info src/plugin.cpp:125] Loaded plugin MSM 0.6.51 from C:\Users\tcdalmar\Documents/Rack/plugins/MSM/plugin.dll
[0.124 info src/plugin.cpp:125] Loaded plugin NWK 0.6.2c from C:\Users\tcdalmar\Documents/Rack/plugins/NWK/plugin.dll
[0.124 info src/plugin.cpp:125] Loaded plugin NYSTHI 0.6.42 from C:\Users\tcdalmar\Documents/Rack/plugins/NYSTHI/plugin.dll
[0.124 info src/plugin.cpp:125] Loaded plugin PvC 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/PvC/plugin.dll
[0.124 info src/plugin.cpp:125] Loaded plugin RJModules 0.6.1 from C:\Users\tcdalmar\Documents/Rack/plugins/RJModules/plugin.dll
[0.124 info src/plugin.cpp:125] Loaded plugin Valley 0.6.16 from C:\Users\tcdalmar\Documents/Rack/plugins/Valley/plugin.dll
[0.124 info src/plugin.cpp:125] Loaded plugin VultModulesFree 0.6.25 from C:\Users\tcdalmar\Documents/Rack/plugins/VultModulesFree/plugin.dll
[0.242 info src/bridge.cpp:339] Bridge server started
[0.270 info src/window.cpp:642] Loaded font C:\Program Files\VCV\Rack/res/fonts/DejaVuSans.ttf
[0.270 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_146097_cc.svg
[0.270 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_31859_cc.svg
[0.270 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1343816_cc.svg
[0.270 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1343811_cc.svg
[0.270 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1084369_cc.svg
[0.271 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1745061_cc.svg
[0.271 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1240789_cc.svg
[0.271 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_305536_cc.svg
[0.271 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_468341_cc.svg
[0.271 info src/settings.cpp:172] Loading settings C:\Users\tcdalmar\Documents/Rack/settings.json
[0.274 info src/settings.cpp:158] Saving settings C:\Users\tcdalmar\Documents/Rack/settings.json
[0.274 info src/app/RackWidget.cpp:143] Loading patch C:\Users\tcdalmar\Documents/Rack/autosave.vcv
[2.862 info src/app/RackWidget.cpp:128] Saving patch C:\Users\tcdalmar\Documents/Rack/autosave.vcv
[2.862 info src/settings.cpp:158] Saving settings C:\Users\tcdalmar\Documents/Rack/settings.json
[2.900 warn src/bridge.cpp:321] Bridge server close() failed

As you can see, there’s Extracting package line: it works!!!.

Now, I delete that folder, the zip.
I than Run F5 on VSCode, which call make install again (generating the zip correctly on the folder) and start automatically Rack.exe.

But here’s the log now:

[0.000 info src/main.cpp:67] VCV Rack 0.6.2c
[0.000 info src/main.cpp:70] Global directory: C:\Program Files\VCV\Rack/
[0.000 info src/main.cpp:71] Local directory: C:\Users\tcdalmar\Documents/Rack/
[0.077 info src/plugin.cpp:125] Loaded plugin AS 0.6.13 from C:\Users\tcdalmar\Documents/Rack/plugins/AS/plugin.dll
[0.147 info src/plugin.cpp:125] Loaded plugin AudibleInstruments 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/AudibleInstruments/plugin.dll
[0.194 info src/plugin.cpp:125] Loaded plugin Befaco 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Befaco/plugin.dll
[0.288 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXDistortionPack 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXDistortionPack/plugin.dll
[0.381 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXF35 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXF35/plugin.dll
[0.478 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXReverb 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXReverb/plugin.dll
[0.584 info src/plugin.cpp:125] Loaded plugin Blamsoft-XFXWave 0.6.1 from C:\Users\tcdalmar\Documents/Rack/plugins/Blamsoft-XFXWave/plugin.dll
[0.694 info src/plugin.cpp:125] Loaded plugin Bogaudio 0.6.13 from C:\Users\tcdalmar\Documents/Rack/plugins/Bogaudio/plugin.dll
[0.757 info src/plugin.cpp:125] Loaded plugin Edge 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/Edge/plugin.dll
[0.835 info src/plugin.cpp:125] Loaded plugin ESeries 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/ESeries/plugin.dll
[0.913 info src/plugin.cpp:125] Loaded plugin Fundamental 0.6.2 from C:\Users\tcdalmar\Documents/Rack/plugins/Fundamental/plugin.dll
[0.976 info src/plugin.cpp:125] Loaded plugin Grayscale 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Grayscale/plugin.dll
[1.073 info src/plugin.cpp:125] Loaded plugin HetrickCV 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/HetrickCV/plugin.dll
[1.131 info src/plugin.cpp:125] Loaded plugin Hora-ModulationFree 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/Hora-ModulationFree/plugin.dll
[1.240 info src/plugin.cpp:125] Loaded plugin ImpromptuModular 0.6.16 from C:\Users\tcdalmar\Documents/Rack/plugins/ImpromptuModular/plugin.dll
[1.334 info src/plugin.cpp:125] Loaded plugin JW-Modules 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/JW-Modules/plugin.dll
[1.412 info src/plugin.cpp:125] Loaded plugin LOGinstruments 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/LOGinstruments/plugin.dll
[1.522 info src/plugin.cpp:125] Loaded plugin mscHack 0.6.3 from C:\Users\tcdalmar\Documents/Rack/plugins/mscHack/plugin.dll
[1.632 info src/plugin.cpp:125] Loaded plugin MSM 0.6.51 from C:\Users\tcdalmar\Documents/Rack/plugins/MSM/plugin.dll
[1.870 info src/plugin.cpp:125] Loaded plugin NYSTHI 0.6.42 from C:\Users\tcdalmar\Documents/Rack/plugins/NYSTHI/plugin.dll
[1.969 info src/plugin.cpp:125] Loaded plugin PvC 0.6.0 from C:\Users\tcdalmar\Documents/Rack/plugins/PvC/plugin.dll
[2.074 info src/plugin.cpp:125] Loaded plugin RJModules 0.6.1 from C:\Users\tcdalmar\Documents/Rack/plugins/RJModules/plugin.dll
[2.181 info src/plugin.cpp:125] Loaded plugin Valley 0.6.16 from C:\Users\tcdalmar\Documents/Rack/plugins/Valley/plugin.dll
[2.291 info src/plugin.cpp:125] Loaded plugin VultModulesFree 0.6.25 from C:\Users\tcdalmar\Documents/Rack/plugins/VultModulesFree/plugin.dll
[3.580 info src/bridge.cpp:339] Bridge server started
[4.158 info src/window.cpp:642] Loaded font C:\Program Files\VCV\Rack/res/fonts/DejaVuSans.ttf
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_146097_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_31859_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1343816_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1343811_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1084369_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1745061_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_1240789_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_305536_cc.svg
[4.158 info src/window.cpp:695] Loaded SVG C:\Program Files\VCV\Rack/res/icons/noun_468341_cc.svg
[4.158 info src/settings.cpp:172] Loading settings C:\Users\tcdalmar\Documents/Rack/settings.json
[4.380 info src/settings.cpp:158] Saving settings C:\Users\tcdalmar\Documents/Rack/settings.json
[4.380 info src/app/RackWidget.cpp:143] Loading patch C:\Users\tcdalmar\Documents/Rack/autosave.vcv
[6.037 info src/app/RackWidget.cpp:128] Saving patch C:\Users\tcdalmar\Documents/Rack/autosave.vcv
[6.037 info src/settings.cpp:158] Saving settings C:\Users\tcdalmar\Documents/Rack/settings.json
[6.545 warn src/bridge.cpp:321] Bridge server close() failed

As you can see, the only line that is missing is the Extracting package.
It doesn’t extract (+ replace) the folder.

Not really sure what it can be. Is there some param to pass to rack? I don’t think…
Also permission: if vscode is able to create/copy a zip, I believe the same process is able to unzip.

Right?

I meant “post what make install runs”, since it needs to expand certain variables.

You also haven’t given any information whatsoever about your system, so basically everything anyone posts here is utter guesswork.

You should make sure that each step is completed successfully by VSCode, using its console or whatever.

@Vortico: right, sorry!

Here’s my system: Windows 10 Professional, 64bit, MinGW (gcc + gdb) and VSCode.
Here’s the output of make install:

> Executing task: make install <

g++  -Wsuggest-override -std=c++11  -DSLUG=NWK -fPIC -I../../include -I../../dep/include -DVERSION=0.6.2c -MMD -MP -g -O0 -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra
-Wno-unused-parameter -DARCH_WIN -D_USE_MATH_DEFINES -c -o build/src/Default.cpp.o src/Default.cpp
g++  -Wsuggest-override -std=c++11  -DSLUG=NWK -fPIC -I../../include -I../../dep/include -DVERSION=0.6.2c -MMD -MP -g -O0 -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra
-Wno-unused-parameter -DARCH_WIN -D_USE_MATH_DEFINES -c -o build/src/Modwhk.cpp.o src/Modwhk.cpp
g++  -Wsuggest-override -std=c++11  -DSLUG=NWK -fPIC -I../../include -I../../dep/include -DVERSION=0.6.2c -MMD -MP -g -O0 -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra
-Wno-unused-parameter -DARCH_WIN -D_USE_MATH_DEFINES -c -o build/src/Enwhk.cpp.o src/Enwhk.cpp
g++  -Wsuggest-override -std=c++11  -DSLUG=NWK -fPIC -I../../include -I../../dep/include -DVERSION=0.6.2c -MMD -MP -g -O0 -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra
-Wno-unused-parameter -DARCH_WIN -D_USE_MATH_DEFINES -c -o build/src/NWK.cpp.o src/NWK.cpp
g++ -o plugin.dll build/src/Default.cpp.o build/src/Modwhk.cpp.o build/src/Enwhk.cpp.o build/src/NWK.cpp.o  -shared -L../.. -lRack
rm -rf dist
mkdir -p dist/NWK
cp plugin.dll dist/NWK/
#strip -s dist/NWK/plugin.dll
cp -R LICENSE.txt res dist/NWK/
cd dist && zip -5 -r NWK-0.6.2c-win.zip NWK
  adding: NWK/ (stored 0%)
  adding: NWK/LICENSE.txt (deflated 60%)
  adding: NWK/plugin.dll (deflated 76%)
  adding: NWK/res/ (stored 0%)
  adding: NWK/res/Default.svg (deflated 76%)
  adding: NWK/res/Enwhk.svg (deflated 69%)
  adding: NWK/res/Modwhk.svg (deflated 69%)
  adding: NWK/res/Screw.svg (deflated 64%)
cp dist/NWK-0.6.2c-win.zip C:\Users\tcdalmar/Documents/Rack/plugins/