-2

Someone can help me? i'm losing my head:

Following code give me stackoverflowexception after updating .net to 4.5.2

private string CalculateStringOrder(Page p, string s)
{
    string res = null;
    char pad = '0';
    try
    {
        if (!String.IsNullOrEmpty(s))
        {

            **THIS GO IN STACK OVERFLOW**
            res = p.ItemOrder.ToString().PadLeft(5, pad) + "." + s;

        }
        else
            res = p.ItemOrder.ToString().PadLeft(5, pad);

        _pagina = p;

        if (_pagina.Parent == null)
            return res;
        while (_pagina.Parent != null)
        {
            res = CalculateStringOrder(_pagina.Parent, res);
        }
        //res = _stringOrder;
    }
    catch (StackOverflowException ex)
    { }
    return res;
}

I've already tried to uninstall update cleaning all reference, but error remains. It has always worked.

@UPDATE

This is stack trace:

BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
BusinessLogic.dll!BusinessLogic.Page.CalculateStringOrder(BusinessLogic.Page p, string s) Riga 52   C#
>   BusinessLogic.dll!BusinessLogic.Page.StringOrder.get() Riga 29  C#
  BusinessLogic.dll!BusinessLogic.PageService.GetParentsTree.AnonymousMethod__2(BusinessLogic.Page x) Riga 40   C#
[Codice esterno]    
BusinessLogic.dll!BusinessLogic.PageService.GetParentsTree() Riga 40    C#
adico.dll!adico.Manager.Topics.Topics() Riga 21 C#
[Codice esterno]    
Fabio
  • 7
  • 1
  • 4
  • 1
    On which line exactly? Did you debug your code? – Soner Gönül May 18 '15 at 10:54
  • @Soner Gönül Yes i have added **THIS GO IN STACK OVERFLOW** to indicate the line; yes i debugged the code, and debbuger stops on that line. – Fabio May 18 '15 at 10:57
  • A StackTrace would be helpfull to resolve this! \As you say the StackOverflowException occurs in `res = String.Format("{0}.{1}", p.ItemOrder.ToString().PadLeft(5, pad), s);` and `String.Format(...)` is very unlikely to cause it, my guess is the `ItemOrder` property in the `Page` class is malfunct. – MrPaulch May 18 '15 at 10:57
  • @Fabio It sounds highly unlikely that `string.Format` is going into SO. It might be the debugger stopping at that line, but that doesn't mean it's where it fails. A stacktrace would be helpful. – Yuval Itzchakov May 18 '15 at 10:58
  • i've update main post adding stack trace; I've correct removing string.format, but result is same – Fabio May 18 '15 at 11:08
  • @MrPaulch please help! – Fabio May 18 '15 at 11:21
  • Recursive functions that modify globals are a hotspot for bugs. Check your code instead of looking for ghost bugs in .NET 4.5. Reinstalling will not help with problems in your code but can result in a broken installation. For example, pass the current page as a `parent` parameter instead of storing it to a global – Panagiotis Kanavos May 18 '15 at 11:34
  • catching StackOverflowException is not possible since .NET 2.0 – Jehof May 18 '15 at 11:35
  • @MrPaulch that is the function for which source has been provided! – freedomn-m May 18 '15 at 11:41
  • Also maybe you want to look into this: [Way-to-go-from-recursion-to-iteration](http://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration) – MrPaulch May 18 '15 at 11:45

2 Answers2

3

Within your Page.Parent.Parent.Parent.etc you have a cyclic reference.

eg p.Parent = p; or p.Parent.Parent.Parent = p;

This gives the stack overflow exception on the line you have indicated, but is a red herring from the debugger.

var p = new Page { ItemOrder = "a" };
p.Parent = p;

Console.WriteLine(CalculateStringOrder(p, "xx"));

One solution would be to keep a record of which pages you have already processed, eg:

var processed = new List<Page>();
...
if (processed.Contains(p)) return res;  // or throw an exception
processed.Add(p);
freedomn-m
  • 27,664
  • 8
  • 35
  • 57
  • My problem is that code is not mine, it is provided by old company that has developed this, so i don't know what all functions and procedures do. So can you say me where i have to put this: var processed = new List(); ... if (processed.Contains(p)) return res; // or throw an exception processed.Add(p); – Fabio May 18 '15 at 11:44
  • My point is that the problem is your *data*, not the code - try looking there. – freedomn-m May 18 '15 at 12:02
  • @Fabio if that `catch (StackOverflowException ex){}` is theirs then, it would seem the bug existed for a loooong time, they knew about it and they tried to hide it by using this (ineffectual) catch. As Jehof noted in the comments, this `catch` stopped working with .NET 2.0, in 2005 – Panagiotis Kanavos May 18 '15 at 12:02
  • Yes i know that try catch stopped work for stack overflow from 2.0, but i repeat, code isn't mine; i'm trying to understand what do and how solve problems that are exiting in it; So it was working until i have update .net on the server – Fabio May 18 '15 at 12:11
  • 2
    @Fabio this code will *always* fail if there are circles in your graph, *no matter the .NET version*. Before *.NET 2.0* the catch would "detect" this by catching the exception. After *2.0* though, the exception will terminate the application. Either the server was running with 1.1 up to now, or circles were introduced in the data that coincided with you changing the runtime. – Panagiotis Kanavos May 18 '15 at 12:20
1

I assume this code tries to collect the ItemOrder values of Page objects starting from the bottom of a tree or path and working up to the root The code is buggy though and will fail if there are any circles in the path, ie the path A -> B -> C-> A will result in an infinite recursion. When that happens, the code tries to catch the inevitable StackOverflowException and return garbage.

In fact, it looks like someone tried to mix both recursive and loop-based code to generate this path.

It's easier to fix the code if the code that generates the path is separate from the code that generates the string. The following code keeps a list of visited pages as @freedomn-m suggested:

private static Stack<Page> PathToTopRec(Page p, Stack<Page> visited=null )
{
    visited = visited ?? new Stack<Page>();
    if (visited.Contains(p))
        return visited;

    visited.Push(p);
    if (p.Parent == null)
        return visited;
    return PathToTopRec(p.Parent, visited);
}

This method will return all parent pages in order from root to leaf. You can then generate the path string with:

    private static string CalculateStringOrder(Page p)
    {
        var path = PathToTopRec(p);

        var builder=new StringBuilder();
        foreach (var p in path)
        {
            builder.AppendFormat("{0:0000}.",p.ItemOrder);
        }
        builder.Remove(builder.Length- 1, 1);
        return builder.ToString();
    }

The new method will return 00001.00002.00003 for the following data:

    var p3 = new Page { ItemOrder = 3 };            
    var p2 = new Page { ItemOrder = 2 };
    var p1 = new Page { ItemOrder = 1 };
    p3.Parent = p2;
    p2.Parent = p1;
    var result=CalculateStringOrder(p3)

Another option is to use looping instead or recursion:

    private static IEnumerable<Page> PathToTop(Page p)
    {
        var visited = new List<Page>();
        var current = p;
        while (current != null)
        {
            yield return current;
            visited.Add(current);
            current = !visited.Contains(current.Parent) 
                ? current.Parent 
                : null;
        }
    }

I'm using an iterator so the result is an IEnumerable with the same pages as PathToTopRec. The only change to the string-generating code is changing adding a call to Reverse() because the iterator will return the pages in the order it finds them, from leaf to root.

var path = PathToTop(p).Reverse();

The iterator has the advantage that you can apply any LINQ operator on it. In fact, string generation could change to:

var strings = PathToTop(p).Where(page=>page.ItemOrder>5)
                       .Select(page=>page.ItemOrder)
                       .Reverse()
                       .Select(it => string.Format("{0:0000}", it));
return String.Join(".", strings);

or any other combination of LINQ operators.

The original code mixes both a recursive call and a while loop, which suggests someone tried to convert the recursive code to a loop at some point but gave up.

Panagiotis Kanavos
  • 120,703
  • 13
  • 188
  • 236