I know this is an old question but I have been doing the same thing myself and the suggestions above do not really help. Inno setup for instance does not use Synedit, it uses scintilla editor.
Also the TPSCustomDebugExec.TranslatePositionEx() does the opposite to what is wanted, it gives a source line number from a runtime code position.
After faffing around for some time I came to the conclusion that the easiest way was to add a function to the Pascalscript code.
the new method is added to the TPSCustomDebugExec class in the uPSdebugger unit.
function TPSCustomDebugExec.HasCode(Filename:string; LineNo:integer):boolean;
var i,j:integer; fi:PFunctionInfo; pt:TIfList; r:PPositionData;
begin
  result:=false;
  for i := 0 to FDebugDataForProcs.Count -1 do
  begin
    fi := FDebugDataForProcs[i];
    pt := fi^.FPositionTable;
    for j := 0 to pt.Count -1 do
    begin
      r:=pt[j];
      result:= SameText(r^.FileName,Filename) and (r^.Row=LineNo);
      if result then exit
    end;
  end;
end;
and the paint gutter callback in the main editor form is as below
procedure Teditor.PaintGutterGlyphs(ACanvas:TCanvas; AClip:TRect;
  FirstLine, LastLine: integer);
var a,b:boolean; LH,LH2,X,Y,ImgIndex:integer;
begin
  begin
    FirstLine := Ed.RowToLine(FirstLine);
    LastLine := Ed.RowToLine(LastLine);
    X := 14;
    LH := Ed.LineHeight;
    LH2:=(LH-imglGutterGlyphs.Height) div 2;
    while FirstLine <= LastLine do
    begin
      Y := LH2+LH*(Ed.LineToRow(FirstLine)-Ed.TopLine);
      a:= ce.HasBreakPoint(ce.MainFileName,FirstLine);
      b:= ce.Exec.HasCode(ce.MainFileName,FirstLine);
      if Factiveline=FirstLine then
      begin
        if a then
          ImgIndex := 2   //Blue arrow+red dot (breakpoint and execution point)
        else
          ImgIndex := 1;  //Blue arrow (current line execution point)
      end
      else
        if b then
        begin
          if a then
            ImgIndex := 3  //Valid Breakpoint marker
          else
            ImgIndex := 0; //blue dot  (has code)
        end
        else
        begin
          if a then
            ImgIndex := 4  //Invalid breakpoint (No code on this line)
          else
            ImgIndex := -1; //Empty (No code for line)
        end;
      if ImgIndex >= 0 then
        imglGutterGlyphs.Draw(ACanvas, X,Y,ImgIndex);
      Inc(FirstLine);
    end;
  end;
end;
The Synedit with Line numbers, code dots, breakpoints, bookmarks and execution point look as in the image below
