Skip to content

ClrMethod.Name returns incorrect result when signature has function pointers #842

@MSDN-WhiteKnight

Description

@MSDN-WhiteKnight

Steps to reproduce

  1. Create WPF Application:
<Window x:Class="ClrmdTest2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ClrmdTest2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Height="45" 
                Margin="63,36,0,0" VerticalAlignment="Top" Width="189" Click="Button_Click"/>
        <TextBox x:Name="textbox" HorizontalAlignment="Left" Height="237" Margin="63,111,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="624"/>

    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Diagnostics.Runtime;

namespace ClrmdTest2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        string PrintMethods(ClrType t)
        {
            StringBuilder sb = new StringBuilder();

            foreach (ClrMethod m in t.Methods)
            {
                sb.AppendLine(m.Name);
            }

            return sb.ToString();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DataTarget dt = DataTarget.CreateSnapshotAndAttach(Process.GetCurrentProcess().Id);
            using (dt)
            {
                ClrInfo ci = dt.ClrVersions[0];
                ClrRuntime clr = ci.CreateRuntime();

                foreach (ClrModule module in clr.EnumerateModules())
                {
                    if (module.Name.EndsWith("PresentationCore.dll"))
                    {
                        foreach (var x in module.EnumerateTypeDefToMethodTableMap())
                        {
                            ClrType t = clr.GetTypeByMethodTable(x.MethodTable);

                            if (t.Name == "<Module>")
                            {
                                textbox.Text = PrintMethods(t);
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}
  1. Run and press Button

Results

.cctor
CriticalPtrToStringChars
ExitCleanup
CopyOffsetDirectoryTables
CopyForgottenTables
FillGlyphIndexArray
CompactMaxpLocaTable
UpdatePrivateTable
CalcOutputBufferSize
CreateDeltaTTF(Byte*, UInt32, Byte**, UInt32*, UInt32*, UInt16, UInt16, UInt16, UInt16, UInt16, UInt16*, UInt16, Void* (Void*, UInt32), Void 
...

Expected results

ClrMethod.Name should return only method name, not fragment of the signature

The signature of CreateDeltaTTF method is:

.method assembly static int16  MS.Internal.TtfDelta.CreateDeltaTTF(uint8 modopt([mscorlib]System.Runtime.CompilerServices.IsConst)* puchSrcBuffer,
                                                                   uint32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong) modopt([mscorlib]System.Runtime.CompilerServices.IsConst) ulSrcBufferSize,
                                                                   uint8** ppuchDestBuffer,
                                                                   uint32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong)* pulDestBufferSize,
                                                                   uint32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong)* pulBytesWritten,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) usFormat,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) usLanguage,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) usPlatform,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) usEncoding,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) usListType,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst)* pusKeepCharCodeList,
                                                                   uint16 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) usListCount,
                                                                   method void* *(void*,
                                                                   uint32) lpfnReAllocate,
                                                                   method void *(void*) lpfnFree,
                                                                   uint32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong) ulOffsetTableOffset,
                                                                   void* lpvReserved) cil managed

This is the same for every method that has function pointers in signature

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions